我尝试将非可空约束添加到视图中的列。这是我的疑问:
alter view myTable add constraint pk_generate2 check(pk is not null);
我试过这个:
alter view myTable add constraint pk_generate2 check(pk is not null) disable;
这也不起作用。
它给出了标题中给出的错误。如何更改查询以使其有效?感谢。
PS:我怀疑没有解决方案,因为没有办法将这样的约束添加到视图中。但是我将ROWNUM添加为视图的主键,以使其可被Entity Framework接受。
答案 0 :(得分:1)
查看约束
Oracle数据库不强制执行视图约束。但是,您可以通过对基表的约束来强制执行对视图的约束。
您只能在视图上指定唯一,主键和外键约束,并且仅在DISABLE NOVALIDATE模式下支持它们。您无法在对象列的属性上定义视图约束。
阅读本文了解更多详情:constraint in Oracle
答案 1 :(得分:0)
如果要将rownum
添加为虚拟主键列,则应添加主键约束,而不仅仅是空检查约束 - 无论如何都不允许在视图上使用。
作为noted in the documentation,只允许使用某些约束类型,并且必须使用disable
和novalidate
进行定义。
关于视图约束的注释
视图约束是表约束的子集,受以下限制:
- 您只能在视图上指定唯一,主键和外键约束。但是,您可以使用WITH CHECK OPTION子句定义视图,这相当于为视图指定检查约束。
- 仅在DISABLE NOVALIDATE模式下支持视图约束。您无法指定任何其他模式。声明视图约束时,必须指定关键字DISABLE。您无需明确指定NOVALIDATE,因为它是默认值 ...
所以你可以这样做:
-- example view with rownum dummy PK column
create view v42 as
select rownum as pk, table_name
from user_tables d;
View V42 created.
alter view v42 add constraint pk_generate2 primary key (pk) disable novalidate;
View V42 altered.
文档还指出
Oracle不强制执行视图约束。但是,视图上的操作受基础基表上定义的完整性约束的约束。这意味着您可以通过对基表的约束来强制执行对视图的约束。
但基于rownum
(或row_number()
)的值不会出现问题。