7

所以我有这个带有复合键的表,基本上'userID'-'data'必须是唯一的(见我的另一个问题SQL table - semi-unique row?

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

还是我在叫错树?

谢谢马拉
_

4

1 回答 1

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');

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

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');
于 2010-01-13T18:12:40.070 回答