Уникальное ограничение на несколько столбцов - PullRequest
35 голосов
/ 03 декабря 2009

Я использую таблицу оракула и создал уникальное ограничение для четырех столбцов. Могут ли эти столбцы в ограничении содержать NULL?

Ответы [ 3 ]

57 голосов
/ 03 декабря 2009

вы можете иметь значения NULL в ваших столбцах, если столбцы не указаны как NOT NULL. Однако вы сможете хранить только один экземпляр NULL (два набора одинаковых столбцов не допускаются, если все столбцы 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
5 голосов
/ 03 декабря 2009

Да, Oracle позволяет ограничениям UNIQUE содержать столбцы с содержимым NULL, но ограничения PRIMARY KEY не могут содержать столбцы, содержащие значения NULL. (Отредактировано: было «... обнуляемые столбцы ...», но мой пример ниже показывает, что это не так. Столбцы в PK могут быть определены как обнуляемые, но не могут содержать NULL.)

Вы не можете иметь ограничение UNIQUE и ограничение PRIMARY KEY с теми же столбцами.

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.
3 голосов
/ 03 декабря 2009

Два пустых значения в Oracle считаются не равными, поэтому в этих столбцах могут быть нулевые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...