首页 > 解决方案 > 如果另一列为空,则两列是唯一的

问题描述

[甲骨文SQL]

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

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

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

谢谢,

标签: sqloracleconstraints

解决方案


您可以使用基于函数的唯一索引。在为空CASE时返回 GUID 。id3如果不是分别返回id1or的实际值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);

db<>小提琴

当然,另一种选择是触发器。但是 index 方法虽然有点难看,但可能是性能更高的方法。


推荐阅读