Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的条件复合密钥?_Sql_Mysql_Conditional_Composite Key - Fatal编程技术网

MySQL中的条件复合密钥?

MySQL中的条件复合密钥?,sql,mysql,conditional,composite-key,Sql,Mysql,Conditional,Composite Key,所以我有一个带有复合键的表,基本上“userID”-“data”必须是唯一的(参见我的另一个问题) 然而,我想知道是否只有当userID不为零时才可以使其生效?我的意思是,‘userID’—‘data’对于非零userID必须是唯一的 还是我找错树了 谢谢 MalaSQL约束适用于表中的每一行。不能基于某些数据值使它们有条件 但是,如果可以使用NULL而不是零,则可以绕过唯一约束。唯一约束允许多个具有NULL的条目。原因是唯一性意味着不可能存在两个相等的值。相等意味着value1=value2必

所以我有一个带有复合键的表,基本上“userID”-“data”必须是唯一的(参见我的另一个问题)

然而,我想知道是否只有当userID不为零时才可以使其生效?我的意思是,‘userID’—‘data’对于非零userID必须是唯一的

还是我找错树了

谢谢

Mala

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

太棒了,谢谢!正如我所说,我使用了不同的解决方案,但你对我的问题给了我一个完美的答案,我将来肯定会使用它=)