如果在sqlite中任何一个都可以为null,如何在多列上设置唯一约束

时间:2012-08-23 14:53:29

标签: sqlite

如果在sqlite中任何一个列都为null,我如何在多列上设置唯一约束?

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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组合,您需要这样的触发器。 此外,如果可以将更新此列的UPDATE更改为NULL,那么您也需要触发器。

答案 2 :(得分:0)

从版本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, "")
);