7

したがって、このテーブルには複合キーがあります。基本的に、「userID」-「data」は一意である必要があります(他の質問のSQLテーブル-半一意の行を参照してください) 。

しかし、userIDがゼロでない場合にのみこれを有効にすることができるかどうか疑問に思いました。つまり、「userID」-「data」はゼロ以外のuserIDに対して一意である必要がありますか?

それとも私は間違った木を吠えていますか?

ありがとう
マラ

4

1 に答える 1

5

SQL制約は、テーブルのすべての行に適用されます。特定のデータ値に基づいて条件付きにすることはできません。

ただし、NULLゼロの代わりに使用できる場合は、一意の制約を回避できます。一意性制約により、。を持つ複数のエントリが許可されますNULL。その理由は、一意性とは、2つの等しい値が存在できないことを意味するためです。平等と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 に答える