【发布时间】:2018-12-23 18:47:06
【问题描述】:
[Oracle SQL]
如果其他列 (id3) 为空,是否可以为两列 (id1, id2) 创建唯一约束?
ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);
如果没有,我还有什么其他方法可以解决这个问题?
谢谢,
【问题讨论】:
标签: sql oracle constraints
[Oracle SQL]
如果其他列 (id3) 为空,是否可以为两列 (id1, id2) 创建唯一约束?
ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);
如果没有,我还有什么其他方法可以解决这个问题?
谢谢,
【问题讨论】:
标签: sql oracle constraints
您可以使用基于函数的唯一索引。在 CASE 中,当 id3 为空时返回 GUID。如果不是分别返回id1或id2的实际值。
唯一的问题是,CASE 的分支中的类型必须兼容。这就是我在这里将它们转换为字符的原因。也许您可以采取不同的方式,具体取决于 id1 和 id2 的数据类型。
CREATE UNIQUE INDEX i_t_id3_nn_id1_id2
ON t
(CASE
WHEN id3 IS NULL THEN
to_char(id1)
ELSE
rawtohex(sys_guid())
END,
CASE
WHEN id3 IS NULL THEN
to_char(id2)
ELSE
rawtohex(sys_guid())
END);
当然,另一种选择是触发器。但是 index 方法虽然有点丑陋,但可能是性能更好的方法。
【讨论】:
dbms_random.random() 一起使用,所以我使用了sys_guid(),因为它不可能两次产生相同的值,更不用说两个相等的对了。但是您可能会找到一种方法来完成上述工作。但请注意,dbms_random.random() 在某些情况下可能会重用值,这可能会导致问题。使用序列可能是最优雅和最有效的方式。