如果我在 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
.
从文档中:
所以似乎没有办法向 RDBMS 暗示底层数据(在
UNION ALL
创建内联视图之后)是NOT NULL
.这一切看起来有点傻,因为 ///语句
UNION
都需要匹配的数据类型!UNION ALL
INTERSECT
MINUS