一个多列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图
是下面的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是多余的吗?
答
我的问题: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
不一样...相同的行与不同的行。 – jarlh
你能解释一下吗? – zigzag
将其简化为参考文献F(E1,E2)并考虑有效的fk! – jarlh