一个多列VS单柱的多个外键外键

问题描述:

考虑以下两个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

我的问题: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