【问题标题】:how to set unique constraint over multiple column when any one can be null in sqlite当sqlite中的任何一个可以为空时,如何在多列上设置唯一约束
【发布时间】:2012-08-23 14:53:28
【问题描述】:

当sqlite中的任何一个都可以为空时,如何对多个列设置唯一约束?

例如我制作了 unique("col1","col2","col3") 并尝试使用insert into tablename values("abc","def",null) 两次,它已经插入了两行。当第三列为空时,唯一约束不起作用。

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    在 sqlite 中,所有的 null 都是差异。 我认为解决此问题的最佳方法是将列 c 设置为不为 null 的特殊默认值。然后使用默认值(例如0,'')来表示null。

    编辑 1

    您可以轻松将此解决方案扩展到任何列

    create table test (
        a text not null default "",
        b text not null default "",
        c text not null default ""
    );
    

    【讨论】:

    • 没有必要只有col c可以为null,任何列都可以为null。例如它可以是 ("abc",null,"def")。
    • 您可以轻松将此解决方案扩展到任何列
    • 给该列不为空不是解决方案,因为这些值可以为空。我正在读取 xml 并输入到 table 。空值是可以接受的。我的问题是如果一个行值是(“a”,“b”,null)并且另一行也有(“a”,“b”,null),那么它不应该进入表中,同时给这些唯一的约束列。我已经定义了唯一(“col1”,“col2”,“col3”)。如果我为两行输入(“a”,“b”,“c”),那么我的唯一约束工作正常但是如果任何 col 值为 null 那么我的唯一约束不起作用。
    • 唯一约束不适用于 sqlite 中的 null 值。但这并没有阻止您使用其他值来替换它。这是解决此类问题的常用方法。只需记住在从 sqlite 检索值时将它们转换回 null 值。
    【解决方案2】:

    您可以创建一个触发器来执行此操作:

    CREATE TRIGGER col1_col2_col3null_unique
    BEFORE INSERT ON MyTable
    FOR EACH ROW
    WHEN col1 IS NOT NULL
     AND col2 IS NOT NULL
     AND col3 IS NULL
    BEGIN
        SELECT RAISE(ABORT, 'col1/col2/col3 must be unique')
        FROM MyTable
        WHERE col1 = NEW.col1
          AND col2 = NEW.col2
          AND col3 IS NULL;
    END;
    

    对于三列中每个可能的 NULL 组合,您都需要一个这样的触发器。 此外,如果有可能有将此类列更改为 NULL 的 UPDATE,那么您也需要这些触发器。

    【讨论】:

      【解决方案3】:

      从版本 3.9.0 (2015-10-14) 开始,您可以在表达式 (https://www.sqlite.org/expridx.html) 上使用索引,并使用例如 COALESCE 函数将 null 值转换为某种形式的后备值:

      CREATE UNIQUE INDEX IX_Unique ON Table1 (
          COALESCE(col1, ""), 
          COALESCE(col2, ""), 
          COALESCE(col3, "")
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 2011-02-11
        • 2015-07-21
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多