【问题标题】:Two columns are unique if other column is null如果另一列为空,则两列是唯一的
【发布时间】:2018-12-23 18:47:06
【问题描述】:

[Oracle SQL]

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

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

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

谢谢,

【问题讨论】:

    标签: sql oracle constraints


    【解决方案1】:

    您可以使用基于函数的唯一索引。在 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;

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

    【讨论】:

    • 您好!谢谢您的答复。是的,我的数据类型是“id1”、“id2”的整数和“id3”的日期。在那种特定情况下,使用 GUID 是否正确?
    • @Jcbo:我无法让它与序列或dbms_random.random() 一起使用,所以我使用了sys_guid(),因为它不可能两次产生相同的值,更不用说两个相等的对了。但是您可能会找到一种方法来完成上述工作。但请注意,dbms_random.random() 在某些情况下可能会重用值,这可能会导致问题。使用序列可能是最优雅和最有效的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多