[Oracle SQL]
如果其他列(id3)为空,是否可以为两个列(id1,id2)创建唯一约束?
ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);
如果没有,我还有什么其他方法可以解决此问题?
谢谢
答案 0 :(得分:2)
您可以使用基于函数的唯一索引。在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);
另一个选择当然是触发器。但是索引方法虽然有点难看,但可能会更有效。