如果在sqlite中任何一个列都为null,我如何在多列上设置唯一约束?
e.g。我已经制作了唯一的(“col1”,“col2”,“col3”)并尝试了insert into tablename values("abc","def",null)
两次它插入两行。当第三列为空时,唯一约束不起作用。
答案 0 :(得分:4)
在sqlite中,所有null都是差异。 我认为解决此问题的最佳方法是使用特殊的默认值将列c设置为null。然后使用默认值(例如0,'')表示null。
您可以轻松地将此解决方案扩展到任何列
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, "")
);