web-dev-qa-db-fra.com

Contrainte unique sur plusieurs colonnes

J'utilise une table Oracle et j'ai créé une contrainte unique sur quatre colonnes. Ces colonnes de la contrainte peuvent-elles contenir NULL?

35
Nicks

vous pouvez avoir des valeurs NULL dans vos colonnes, sauf si les colonnes sont spécifiées NOT NULL. Cependant, vous ne pourrez stocker qu'une seule instance de NULL (aucun ensemble de mêmes colonnes ne sera autorisé à moins que toutes les colonnes soient NULL):

SQL> CREATE TABLE t (id1 NUMBER, id2 NUMBER);

Table created
SQL> ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);

Table altered
SQL> INSERT INTO t VALUES (1, NULL);

1 row inserted
SQL> INSERT INTO t VALUES (1, NULL);

INSERT INTO t VALUES (1, NULL)

ORA-00001: unique constraint (VNZ.U_T) violated

SQL> /* you can insert two sets of NULL, NULL however */
SQL> INSERT INTO t VALUES (NULL, NULL);

1 row inserted
SQL> INSERT INTO t VALUES (NULL, NULL);

1 row inserted
57
Vincent Malgrat

Oui, Oracle autorise les contraintes UNIQUE à contenir des colonnes avec un contenu NULL, mais les contraintes PRIMARY KEY ne peuvent pas contenir de colonnes contenant des valeurs NULL. (Modifié: était "... colonnes nullables ...", mais mon exemple ci-dessous montre que ce n'est pas vrai. Les colonnes d'un PK peuvent être définies comme nullables, mais ne peuvent pas contenir NULL.)

Vous ne pouvez pas avoir une contrainte UNIQUE et une contrainte PRIMARY KEY avec les mêmes colonnes.

SQL> create table stest (col1 integer not null, col2 integer null);

Table created.

SQL> alter table stest add constraint stest_uq unique (col1, col2);

Table altered.

SQL> insert into stest values (1, 3);

1 row created.

SQL> insert into stest values (1, null);

1 row created.

SQL> insert into stest values (1, null);
insert into stest values (1, null)
*
ERROR at line 1:
ORA-00001: unique constraint (SUSAN_INT.STEST_UQ) violated

SQL> insert into stest values (2, null);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from stest;

      COL1       COL2
---------- ----------
         1          3
         1
         2

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2)
                                                             *
ERROR at line 1:
ORA-01449: column contains NULL values; cannot alter to NOT NULL

SQL> truncate table stest;

Table truncated.

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2)
                                          *
ERROR at line 1:
ORA-02261: such unique or primary key already exists in the table

SQL> alter table stest drop constraint stest_uq;

Table altered.

SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);

Table altered.
5
shoover

Deux valeurs nulles sont considérées comme différentes dans Oracle, de sorte que ces colonnes peuvent contenir des valeurs nulles.

3
Amber Shah