gpt4 book ai didi

sql - 如何使标记为 'historical' 的某些 Oracle 表行不可见/不可用?

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:05 26 4
gpt4 key购买 nike

我有一个庞大的现有订单管理应用程序。

现在,在主 ORDER 表中,我添加了一个新列:IS_HISTORICAL。如果其值为:TRUE,则表示订单现在是历史订单,不应显示在应用程序中。

现在,我必须修改现有应用程序中的许多 SQL 查询,以便它们仅选择 IS_HISTORICAL 为“FALSE”的订单 - 即在 WHERE 子句中添加以下内容:

  AND IS_HISTORICAL='FALSE'

问题: *是否有更简单的方法 - 这样我就不必修改那么多应用程序查询(隐藏历史订单)?
基本上所有标记为 IS_HISTORICAL='TRUE' 的订单都应该变得不可见/不可用于读取/更新!!*

注意:现在表的大小不是很大,但最终我打算按 IS_HISTORICAL true/false 对表进行分区。

最佳答案

如果您只打算使用历史数据进行分析,那么我更喜欢 Florin 的解决方案,因为您需要为每个查询查看的数据量仍然较小。它使分析查询更加困难,因为您需要 UNION ALL 但其他所有内容都会“更快”运行(可能不会引起注意)。

如果某些应用程序/用户需要访问历史数据,更好的解决方案是重命名您的表并使用您需要的查询在其之上创建一个 View 。

重写所有查询的问题是您现在或将来会忘记一个或弄错一个。 View 为您消除了这个问题,因为查询是静态的,每次您查询 View 时,都会自动添加您需要的附加条件。

类似于:

rename orders to order_history;

create or replace view orders as
select *
from order_history
where is_historical = 'FALSE';

还有两点。

  1. 我不会为 TRUE/FALSE 而烦恼,如果表变大,需要扫描大量额外数据。将您的列创建为 VARCHAR2(1) 并使用 T/FY/N,它们是立即明显但较小。或者使用 NUMBER(1,0) 和 1/0
  2. 不要忘记对您的表施加约束,以便 IS_HISTORICAL 列只能包含您选择的值。

    如果您只需要这两个值,那么您可能需要考虑 CHECK CONSTRAINT :

    alter table order_history 
    add constraint chk_order_history_historical
    check ( is_historical in ('T','F') );

    否则,也许你应该这样做,使用 FOREIGN KEY CONSTRAINT .定义一个额外的表,ORDER_HISTORY_TYPES

    create table order_history_types ( 
    id varchar2(1)
    , description varchar2(4000)
    , constraint pk_order_history_types primary key (id)
    );

    用你的值填充它,然后添加外键:

    alter table order_history 
    add constraint fk_order_history_historical
    foreign key (is_historical)
    references order_history_types (id)

关于sql - 如何使标记为 'historical' 的某些 Oracle 表行不可见/不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14932143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com