MySQL中的条件复合键?

Mal*_*ala 7 mysql sql conditional composite-key

所以我有一个带有复合键的表,基本上是'userID' - 'data'必须是唯一的(参见我的其他问题SQL表 - 半唯一行?)

但是,我想知道是否有可能使这只在userID不为零时生效?我的意思是'userID' - 'data'对于非零userID必须是唯一的?

还是我在错误的树上吠叫?

由于
马拉

Bil*_*win 5

SQL约束适用于表中的每一行.您无法根据某些数据值使其成为条件.

但是,如果您可以使用NULL而不是零,则可以绕过唯一约束.唯一约束允许具有多个条目NULL.原因是唯一性意味着不存在两个相等的值.平等意味着value1 = value2必须是真实的.但在SQL,NULL = NULL未知的,不正确的.

CREATE TABLE MyTable (id SERIAL PRIMARY KEY, userid INT, data VARCHAR(64));

INSERT INTO MyTable (userid, data) VALUES (   1, 'foo');
INSERT INTO MyTable (userid, data) VALUES (   1, 'bar');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz');
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,现在您可能认为以下语句会违反唯一约束,但它们不会:

INSERT INTO MyTable (userid, data) VALUES (   1, 'baz');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'foo');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz');
Run Code Online (Sandbox Code Playgroud)