使SQLite在UNIQUE约束中认为空值不明确

gcuhipw9  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(167)

在SQLite中,UNIQUE约束NULL是不同的(source)。在我的用例中,我希望NULL对于特定的UNIQUE约束是模糊的。下面的示例显示了我想要的内容。

sqlite> CREATE TABLE Foo (Name TEXT NOT NULL, Nullable TEXT, UNIQUE(Name, Nullable));
sqlite> INSERT INTO Foo(Name, Nullable) VALUES('foo', 'bar');
sqlite> INSERT INTO Foo(Name, Nullable) VALUES('foo', 'bar'); -- Errors as expected
Runtime error: UNIQUE constraint failed: Foo.Name, Foo.Nullable (19)
sqlite> INSERT INTO Foo(Name) VALUES('baz');
sqlite> INSERT INTO Foo(Name) VALUES('baz'); -- I want this to error, but it doesn't

似乎PostgreSQL在NULLS NOT DISTINCT中支持这一点,但这种语法在SQLite中不起作用。所以,我想知道如何才能在SQLite中获得这种行为。

mgdq6dx1

mgdq6dx11#

您需要将NULL值转换为某个值,才能使其计入唯一索引。
通过以下方式创建您的唯一索引:

CREATE UNIQUE INDEX `idx_my_unique` ON Foo (
    Name,
    IFNULL(Nullable, '')
);

当然,从唯一性的Angular 来看,这有一个限制,即空字符串和NULL将被视为相同的值。如果这不限制您,您可以选择此设计。
否则,您需要重新设计表,以便在没有NULL值的列上使用唯一索引。

相关问题