2009-12-03 33 views
25

Estoy utilizando una tabla de Oracle y he creado una restricción única sobre cuatro columnas. ¿Pueden estas columnas dentro de la restricción tener NULL en ellas?Restricción única en varias columnas

+3

Me parece que es bastante trivial para averiguar la respuesta a esto con una prueba. ¿Puede tomar más de un minuto hacerlo? –

+7

Sí, tienes razón. Pero he aprendido otra información de las respuestas que Vincent, Amber y Shoover han publicado. – Nicks

Respuesta

41

puede tener valores nulos en sus columnas a menos que las columnas se especifican NOT NULL. Usted será capaz de almacenar sólo una instancia de valores NULL sin embargo (no se permitirán dos conjuntos de mismas columnas a menos que todas las columnas son 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 
2

Dos nulos no se consideran iguales en Oracle, por lo que estas columnas pueden tener nulos en ellos.

5

Sí, Oracle permite que las restricciones ÚNICAS contengan columnas con contenido NULO, pero las restricciones PRIMARY KEY no pueden contener columnas que contengan valores NULL. (Editado: era "... columnas que aceptan nulos", pero mi ejemplo a continuación muestra que no es cierto. Las columnas en un PK se pueden definir como nulables, pero no pueden contener NULL).

No puede tener un Restricción ÚNICA y una restricción PRIMARY KEY con las mismas columnas.

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. 
Cuestiones relacionadas