在 Oracle 中创建依赖于其他列的约束
请考虑 Oracle 上的以下表结构:
create table DOCS
(
DOC_NO NUMBER not null,
DOC_TYPE VARCHAR2(5) not null,
PMT_NO NUMBER not null
);
在该表中,PMT_NO 列必须是唯一的,除非 DOC_NO 相同且 DOC_TYPE 不同:
DOC_NO DOC_TYPE PMT_NO
---------- -------- ----------
1 A 10 <-- good
1 B 10 <-- good, DOC_NO is the same
2 C 10 <-- NOT good, DOC_NO is different
PMT_NO 不能重复且不能有“空洞”(即 1、2、3、5) ,所以序列不起作用。并且有很多用户同时插入数据。
有没有办法为该条件创建唯一键/唯一索引/基于函数的索引?
谢谢!
Please consider the following table structure on Oracle:
create table DOCS
(
DOC_NO NUMBER not null,
DOC_TYPE VARCHAR2(5) not null,
PMT_NO NUMBER not null
);
In this table, the PMT_NO column has to be unique except when DOC_NO is the same and DOC_TYPE is different:
DOC_NO DOC_TYPE PMT_NO
---------- -------- ----------
1 A 10 <-- good
1 B 10 <-- good, DOC_NO is the same
2 C 10 <-- NOT good, DOC_NO is different
PMT_NO cannot repeat and cannot have "holes" (i.e. 1, 2, 3, 5), so a sequence would not work. And there are many users inserting data at the same time.
Is there a way to create a unique key / unique index / function-based index for that condition?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
也许这是一个标准化问题。
您可以将相关元组提取到另一个表中,以便该行是唯一的。
在本例中,将
doc_no
链接到pmt_no
一次(不像您所示的那样重复)。然后你可以在这个链接表的
pmt_no
列上创建唯一索引。Maybe this is a normalization problem.
You could pull out the relevant tuple into another table such that the row would be unique.
In this case link
doc_no
topmt_no
, once (not repeated as you have shown).Then you can make a unique index on the
pmt_no
column of this link table.