2009-12-03 239 views
25

我使用的是一个oracle表,并且已经在四列创建了一个唯一的约束。约束中的这些列可以有NULL吗?多列唯一约束

+3

在我看来,这是非常容易的找出答案这与一个测试。这样做可能需要一分多钟吗? – 2009-12-04 09:04:05

+7

是的 - 你说得对。但是我从Vincent,Amber和Shoover发布的答案中学到了其他信息。 – Nicks 2009-12-04 09:37:04

回答

41

除非列指定为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 
2

Oracle中有两个空值被认为是不相等的,所以这些列可以包含空值。

5

是的,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.