BBrooklyn
BBrooklyn

Reputation: 429

SQL table not obeying its unique constraint

I set up an SQL table in sqlite3 with the following command:

CREATE TABLE "userstrings" (
    'user_id' INTEGER NOT NULL,
    'cat_id' INTEGER NOT NULL,
    'name_id' INTEGER,
    CONSTRAINT unq UNIQUE(user_id, cat_id, name_id)
)

I'm still wiring up the user interface but I noticed in the table there were four rows all with user_id = 10, cat_id = 8, and name_id = NULL.

Does NULL somehow circumvent unique constraints? Ultimately, the goal is to only allow unique rows, and to allow name_id to be null.

Upvotes: 5

Views: 1644

Answers (2)

Tim Biegeleisen
Tim Biegeleisen

Reputation: 521194

SQLite does not consider multiple NULL values are counting towards a violation of a unique constraint (nor do several other major database). See here for the SQLite documentation on this.

So using NULL as a placeholder may not behave as intended in the context of a unique constraint. One possible workaround would be to use a different placeholder value, e.g. -1 instead. The following INSERT statement would fail:

INSERT INTO userstrings (user_id, cat_id, name_id)
VALUES
    (1, 1, -1),
    (1, 1, -1);

Whereas had the name_id values both been NULL, the insert would have succeeded.

Upvotes: 5

Scott Althaus
Scott Althaus

Reputation: 85

According to the ANSI standards, a UNIQUE constraint should not allow duplicate non-NULL values but does in fact allow multiple NULL values.

The SQL standard requires that a UNIQUE constraint be enforced even if one or more of the columns in the constraint are NULL however SQLite does not enforce this rule.

Upvotes: 4

Related Questions