3

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

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

4

3 回答 3

5

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

编辑 1

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

create table test (
    a text not null default "",
    b text not null default "",
    c text not null default ""
);
于 2012-08-23T15:28:33.060 回答
1

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

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,那么您也需要这些触发器。

于 2014-09-23T07:32:44.763 回答
1

从版本 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, "")
);
于 2016-11-28T13:21:18.630 回答