2017-08-31 120 views
2

考慮以下兩個SQL代碼段:一個多列VS單柱的多個外鍵外鍵

SQL代碼1:

CONSTRAINT FK_E 
     FOREIGN KEY (E1, E2, E3) 
     REFERENCES F (E1, E2, E3), 

SQL代碼2:

CONSTRAINT FK_E1 
     FOREIGN KEY (E1) 
     REFERENCES F (E1), 

CONSTRAINT FK_E2 
     FOREIGN KEY (E2) 
     REFERENCES F (E2), 

CONSTRAINT FK_E3 
     FOREIGN KEY (E3) 
     REFERENCES F (E3), 

我的問題是:SQL代碼1和SQL代碼2是否相等?即它們是否以同樣的方式在DBMS中解釋?如果不是,他們之間有什麼區別?

EDIT1:更具體考慮以下ER圖

enter image description here

是下面的SQL代碼是否正確?

CREATE TABLE E 
(EID NUMBER PRIMARY KEY); 


CREATE TABLE F 
(FID NUMBER PRIMARY KEY); 


CREATE TABLE G 
     (EID NUMBER, 
     FID NUMBER, 
     GNAME VARCHAR(50), 
     CONSTRAINT G_PK 
      PRIMARY KEY (EID, FID, GNAME), 
     CONSTRAINT FK_G_EID 
      FOREIGN KEY (EID) 
      REFERENCES E (EID), 
     CONSTRAINT FK_G_FID 
      FOREIGN KEY (FID) 
      REFERENCES F (FID) 
); 


CREATE TABLE R1 
     (EIDE NUMBER, 
     EIDG NUMBER, 
     FIDG NUMBER, 
     GNAME VARCHAR(50), 
     ATTR1 NUMBER, 
     CONSTRAINT PK_R1 
      PRIMARY KEY (EIDG, FIDG, GNAME), 
     CONSTRAINT FK_R1_EIDG_FIDG_GNAME 
      FOREIGN KEY (EIDG, FIDG, GNAME) 
      REFERENCES G (EID, FID, GNAME), 
     CONSTRAINT FK_R1_EIDE 
      FOREIGN KEY (EIDE) 
      REFERENCES E (EID) 
); 


CREATE TABLE R2 
     (FIDF NUMBER UNIQUE, 
     FIDG NUMBER, 
     EIDG NUMBER, 
     GNAME VARCHAR(50), 
     ATTR2 NUMBER, 
     CONSTRAINT PK_R2 
      PRIMARY KEY (EIDG, FIDG, GNAME), 
     CONSTRAINT FK_R2_EIDG_FIDG_GNAME 
      FOREIGN KEY (EIDG, FIDG, GNAME) 
      REFERENCES G (EID, FID, GNAME), 
     CONSTRAINT FK_R2_FIDF 
      FOREIGN KEY (FIDF) 
      REFERENCES F (FID) 
); 

EDIT2:FK_R1_EIDE和FK_R2_FIDF是多餘的嗎?

+0

不一樣...相同的行與不同的行。 – jarlh

+0

你能解釋一下嗎? – zigzag

+0

將其簡化爲參考文獻F(E1,E2)並考慮有效的fk! – jarlh

回答

1

我的問題:SQL代碼1和SQL代碼2是否相等?

不是,它們不是等價的。

通過the definition

外鍵約束

外鍵約束(也稱爲引用完整性 約束)爲列的外鍵,建立外鍵之間的 關係和指定的主鍵或 唯一鍵,稱爲引用鍵。複合外鍵 指定列的組合作爲外鍵。


按照此聲明之上:

CONSTRAINT FK_E 
     FOREIGN KEY (E1, E2, E3) 
     REFERENCES F (E1, E2, E3), 

假定存在或者在F

CREATE TABLE F(
    ..... 
    ..... 
    CONSTRAINT my_pk PRIMARY KEY(E1, E2, E3) 
) 

創建而此主鍵或唯一約束聲明

CONSTRAINT FK_E1 
     FOREIGN KEY (E1) 
     REFERENCES F (E1), 

CONSTRAINT FK_E2 
     FOREIGN KEY (E2) 
     REFERENCES F (E2), 

CONSTRAINT FK_E3 
     FOREIGN KEY (E3) 
     REFERENCES F (E3), 

是在需要的三個約束的存在,無論是主鍵或唯一indexses /約束:

CREATE TABLE F(
    ..... 
    ..... 
    CONSTRAINT my_pk1 PRIMARY KEY(E1), 
    CONSTRAINT my_uq2 UNIQUE(E2), 
    CONSTRAINT my_uq3 UNIQUE(E3) 
) 

注1-表只能有一個主密鑰,所以只有一個你的例子中的約束可能是主鍵,其餘2個(或全部3個)必須是唯一鍵。

注2 - 主鍵約束和唯一鍵約束之間存在細微的語義差異。主鍵值必須唯一,並且不得包含空值,而唯一鍵值可以爲NULL。


在第一種情況下,表F可以包含這些值

E1 E2 E3 
1 1 1 
1 1 2 
2 2 1 

和子表中只能包含這些記錄:

E1 E2 E3 
1 1 1 
1 1 2 
2 2 1 

,但你不能插入到子表這些值的組合因爲它們不存在於父表中:

E1 E2 E3 
1 2 1 
2 2 2 

在secondcase表F可以包含這些值

E1 E2 E3 
1 1 1 
2 2 2 
3 3 3 

但不能包含這些值,因爲每一列必須是唯一的:

E1 E2 E3 
1 1 1 
1 1 2 
2 1 3 

而子表包含這些記錄:

E1 E2 E3 
1 2 3 
3 1 2 
2 1 3