Oracle

有沒有辦法在視圖中明確地有一個非空列

  • August 15, 2013

如果我在 Oracle 中創建視圖,則列定義的非空特性是從基表繼承的:

create table tq84_t (
 col_1   number,
 col_2   varchar2(15) not null
);

create view tq84_v as select col_1, col_2 from tq84_t;

desc tq84_v;

將列印

Name            Null?    Type
--------------- -------- -----------------------------------------
COL_1                    NUMBER
COL_2           NOT NULL VARCHAR2(15)

現在,如果視圖的 select 語句包含 a union all,似乎該特徵不再被繼承:

drop view tq84_v;

create view tq84_v as 
 select col_1, col_2 from tq84_t where col_1 < 10 union all 
 select col_1, col_2 from tq84_t where col_2 > 20;

desc tq84_v;

印刷:

Name            Null?    Type
--------------- -------- -----------------------------------------
COL_1                    NUMBER
COL_2                    VARCHAR2(15)

這對我的目的來說有點不幸。那麼,有沒有辦法明確聲明一列not null用於 Oracle 中的視圖?

注意:我顯然使用了簡化的視圖定義來展示問題,我可以在不使用union all. 然而,我的實際視圖定義要復雜得多,需要union all.

文件中

您只能在視圖上指定唯一、主鍵和外鍵約束。但是,您可以使用 WITH CHECK OPTION 子句定義視圖,這相當於為視圖指定檢查約束。

所以似乎沒有辦法向 RDBMS 暗示底層數據(在UNION ALL創建內聯視圖之後)是NOT NULL.

這一切看起來有點傻,因為 ///語句UNION都需要匹配的數據類型!UNION ALL``INTERSECT``MINUS

引用自:https://dba.stackexchange.com/questions/48169