2010-03-10 82 views
6

我有兩張如下定義的表A和B.如何獲得可能具有空值的主鍵組合?

create table A 
(
    A_1 varchar2(10) NOT NULL, 
    A_2 varchar2(10), 
    A_3 varchar2(10), 
    constraint A_PK primary key (A_1,A_2) 
) 
TABLE A DATA 
A_1  |A_2 |A_3 
1111  abc  some_text1 
1111  null some_text1 
1112  abc  some_text2 
1113  def  some_text3 

    create table B 
    (
    B_1 varchar2(10) NOT NULL, 
    B_2 varchar2(10), 
    B_3 varchar2(10), 
    constraint B_PK primary key (B_1,B_2,B_3), 
    constraint B_FK foreign key (B_1,B2) references A(A_1,A_2) 
    ) 
TABLE B DATA 
B_1 | B_2 |B_3 
1111 abc  text1 
1111 null  text2 
1111 null  text3 
1111 null  text4 

表A中的A_2列有時可以爲空,但A_1和A_2的組合總是唯一的。我需要A_2成爲主鍵的一部分,因爲那時只有我可以在表B中引用A_1和A_2它們作爲外鍵。這裏的問題是主鍵不能爲空。如何解決這個問題呢? 任何迴應將不勝感激

回答

21

您解決這個問題,因爲沒有這個作爲主鍵。主鍵不能是NULL,或者如果它們是複合主鍵,則不能包含NULL。請將其作爲唯一索引。爲主鍵創建一個自動編號字段。

2

在主鍵中不能有空列,但是可以使用空列創建唯一索引。爲了得到這個在Oracle 10g中工作,我也只好在桌子上明確地添加獨特的contraint:

create table t1 (a1 integer not null, 
       a2 integer, 
       a3 integer); 

create unique index t1_uk1 on t1(a1, a2); 

alter table t1 add constraint t1_cuk1 unique (a1, a2); 

create table b1 (b1 integer not null, b2 integer, b3 integer); 

create index b1_idx1 on b1 (b1, b2); 

alter table b1 add constraint b1_fk1 
    foreign key (b1, b2) references t1 (a1, a2); 

不過,我嘗試了測試此設置,它不工作,像我估計它會。例如:

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

1 row created. 

SQL> insert into b1 values (1, 1, 1); 
insert into b1 values (1, 1, 1) 
* 
ERROR at line 1: 
ORA-02291: integrity constraint (B1_FK1) violated - parent key not 
found 

好的,這是預期的。在父母沒有行,所以排不應該在子表但允許,:

SQL> insert into b1 values (2, null, 1); 

1 row created. 

看起來它只是讓該行獲得插入不會失敗,即使有,空t1中沒有行與2根本!

SQL> commit; 

Commit complete. 

SQL> select * from t1; 

     A1   A2   A3 
---------- ---------- ---------- 
     1      1 

SQL> select * from b1; 

     B1   B2   B3 
---------- ---------- ---------- 
     2      1 

我對這種行爲感到驚訝,因爲在T1上唯一索引的行爲,你會期待它(只有1行可與1插入,空等)。

1

如果您在主鍵上使用「可推遲初始延遲」,則可以有NULL值...

相關問題