如何在多列上创建复合键
如何在多个列上创建复合键,其中一列可以有一些值但不能为空(或某个常量值)?
例如:
PK Loc_ID Date Time Cancelled
1 1 01/01/2010 10:00AM YES
2 1 01/01/2010 10:00AM YES
3 1 01/01/2010 10:00AM null
4 1 01/01/2010 10:00AM null - Not Acceptable
插入第四条记录应引发复合键冲突错误。
How can I create a composite key on multiple columns, one of which can have some value but not null (or some constant value)?
For example:
PK Loc_ID Date Time Cancelled
1 1 01/01/2010 10:00AM YES
2 1 01/01/2010 10:00AM YES
3 1 01/01/2010 10:00AM null
4 1 01/01/2010 10:00AM null - Not Acceptable
Insertion of the fourth record should raise a composite key violation error.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
那么,您要执行一条规则,即对于任何给定的 LOC_ID、DATE、TIME 排列,只能取消记录?我们可以使用基于函数的唯一索引来做到这一点。
这是我们想要避免的:
让我们构建一个索引来强制执行规则
NVL2()
函数是 CASE 的一种特殊形式,如果第一个参数不为 NULL,则返回第二个参数,否则返回第三个参数。该索引使用 PK col 作为第二个参数,因为它是主键,因此是唯一的。因此索引允许重复的 CANCELLED 值,除非它们为空:So what you what is to enforce a rule where only record cannot be cancelled for any given permutation of LOC_ID, DATE, TIME? We can do this with a function-based unique index.
This is what we want to avoid:
Let's build an index to enforce the rule
The
NVL2()
function is a special form of CASE which returns the second argument if the first argument is NOT NULL otherwise the third. The index uses the PK col as the second argument because it is the primary key and hence unique. So the index allows duplicate values of CANCELLED unless they are null:这可以通过基于唯一函数的索引来完成吗?像这样的东西:
Could this be done with a unique function based index? Something like:
如果规则是对于 LOC_ID、DATE_COL 和 TIME_COL 的特定组合只有一个 NULL 取消值:
If the rule is that only one NULL cancelled value for a particular combination of LOC_ID, DATE_COL, and TIME_COL:
我不确定这在 Oracle 中是否有效,但在 Postgresql 中,您可以使用 null 上的部分多列索引(不包括 null 列)来实现此目的。
I'm not sure this is valid in Oracle, but in Postgresql you could do this with a partial multicolumn index on null, excluding the column that is null.