如果其他列为空,则两列是唯一的

时间:2018-12-23 18:47:07

标签: sql oracle constraints

[Oracle SQL]

如果其他列(id3)为空,是否可以为两个列(id1,id2)创建唯一约束?

ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);

如果没有,我还有什么其他方法可以解决此问题?

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用基于函数的唯一索引。在CASE为空时,在id3中返回GUID。如果未返回,则分别返回id1id2的实际值。

唯一的问题是CASE分支中的类型必须兼容。这就是为什么我在这里将它们转换为字符的原因。也许您可以不同地执行此操作,具体取决于id1id2的数据类型。

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);

db<>fiddle;

另一个选择当然是触发器。但是索引方法虽然有点难看,但可能会更有效。