在此数据库中,key1
& key2
组成table4
的复合主键,但我能够将{8}的外键添加到table3
。
为什么MySQL允许这个?上述数据库设计是否完全没有意义?
答案 0 :(得分:2)
TL; DR它不是标准的SQL。 MySQL文档本身建议不要这样做。
在SQL中,FOREIGN KEY声明必须引用声明为PRIMARY KEY或UNIQUE NOT NULL的列列表。 (PRIMARY KEY创建一个UNIQUE NOT NULL约束。)(约束必须是显式的,即使任何包含UNIQUE集合的NOT NULL列必须是唯一的。)
MySQL文档说:
对于诸如UPDATE或DELETE CASCADE之类的操作,没有很好地定义对非唯一键或包含NULL值的键的外键引用的处理。建议您使用只引用UNIQUE(或PRIMARY)和NOT NULL的键的外键。
(您可以仔细考虑什么是明确定义的操作,因为文档实际上没有明确说明。)
1.8.2.3 Foreign Key Differences
13.1.18 CREATE TABLE Syntax
13.1.18.6 Using FOREIGN KEY Constraints
在关系模型中,FK引用CK(候选键)。超级键是唯一的列集。 CK是超级密钥,不包含更小的超级密钥。一个CK可以称为PK(主键)。当列集的值必须出现在别处时,我们说有一个IND(包含依赖)。 FK是CK的IND。当一个IND是一个超级键时,我们可以称之为“外国超级键”。
SQL PRIMARY KEY声明一个超级键。当它不包含较小的UNIQUE NOT NULL列集时,它是PK(因此为CK)。 SQL UNIQUE NOT NULL声明一个超级键。当它不包含较小的PRIMARY KEY或UNIQUE NOT NULL列集时,它是CK。 SQL FOREIGN KEY声明一个外部超级键。 PRIMARY KEY实际上可能是 PK(因此是CK),而UNIQUE NOT NULL实际上可能是CK。然后,这些的SQL FOREIGN KEY 是一个FK。
答案 1 :(得分:0)
外键根本不依赖于主键。实际上,它们与主键无关。
主键的唯一目的是唯一地标识一行。
外键的目的是确保对于引用表(子表)中的每个条目,在引用的表(父表)中必须有一个条目。 MySQL中唯一的技术要求是在引用列上必须有索引(不一定是主键或唯一键,简单索引就足够了)。
因此,你的设计是有道理的,是的。