序列中的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的
version
12c
中,序列的下一个值可能被设置为列的默认值:

然后可以添加检查约束以提供所需的条件,如下所示:

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);