序列中的Oracle约束
我试图在列上创建一个约束,它必须在一个序列中(即序列中的Oracle约束,oracle,constraints,sequence,oracle12c,ddl,Oracle,Constraints,Sequence,Oracle12c,Ddl,我试图在列上创建一个约束,它必须在一个序列中(即col\u name
col\u name
)
我尝试使用常规约束,但该列没有任何可关联的内容—它只是一个序列,而不是表中的一列
检查不能引用任何类型的查询,因此我认为这也不起作用
ALTER TABLE STE_FILECOLL ADD (
CONSTRAINT STE_FC_CLFC_REF_STEF_IDFILE
FOREIGN KEY (CLFILECOLL)
REFERENCES ????
ENABLE VALIDATE
);
我希望有一种方法可以确保列的值在一个序列内,但是一个小时的阅读文档和访问都是徒劳的,所以我转到这里。唯一的序列伪列是
nextval
和currval
,所以不能使用这种语法。内联约束非常有限。我想你最好的办法是用扳机
[...]
select as.maxval into l_maxval from all_sequences where sequence_name = 'my_sequence';
if :new.col_name > l_maxval then
raise_application_error( -20001, 'too big' );
end if;
在Oracle DB的version12c
中,序列的下一个值可能被设置为列的默认值:
然后可以添加检查约束以提供所需的条件,如下所示:
alter table STE_FILECOLL
添加约束STE_CC_CLFC_REF_STEF_IDFILE
检查(列名称<列0);
为什么要这样做?如果您只想使用序列来填充列,您可以很容易地完成这项工作。或者创建一个外键,该外键引用一个表,该表的列已根据该序列填充。但考虑到多用户环境的现实情况,即使定义序列的最大值也可能会有问题。我们最近升级到12c,所以这是一个选项,我以前没有意识到它的存在。谢谢@克里斯伯勒斯,别紧张。
create table STE_FILECOLL
(
col0 int default seq1.nextval not null,
col_name int
);
alter table STE_FILECOLL
add constraint STE_CC_CLFC_REF_STEF_IDFILE
check (col_name < col0);