【问题标题】:Oracle constraint within a sequence序列中的 Oracle 约束
【发布时间】:2019-02-18 19:48:55
【问题描述】:

我正在尝试对必须在序列内的列创建一个约束(即col_name < seq.maxval

我尝试使用常规约束,但该列没有任何关联 - 它只是一个序列,而不是表中的列。

检查不能引用任何类型的查询,所以我认为这也行不通。

ALTER TABLE STE_FILECOLL ADD (
  CONSTRAINT STE_FC_CLFC_REF_STEF_IDFILE
  FOREIGN KEY (CLFILECOLL) 
  REFERENCES ????
  ENABLE VALIDATE
);

我希望有一种方法可以确保列的值在一个序列内,但是一个小时的阅读文档和duckduckgoing 没有结果,所以我转向这里。

【问题讨论】:

  • 您为什么要这样做?如果您只想使用序列来填充列,您可以很容易地做到这一点。或者创建一个外键来引用一个表,该表的列已经从该序列中填充。但考虑到多用户环境的现实,即使定义序列的最大值也可能存在问题。

标签: oracle constraints sequence oracle12c ddl


【解决方案1】:

Oracle DB 版本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); 

【讨论】:

  • 我们最近升级到 12c,所以这是一个我没有意识到存在的选项。谢谢!
  • @ChrisBurrus 放轻松。
【解决方案2】:

唯一的序列伪列是nextvalcurrval,所以你不能使用那种语法。内联约束非常有限。我认为你最好的选择是使用触发器。

[...]
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;

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2011-08-18
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多