mySQL复合键,主键,唯一键和对复合键的引用

时间:2019-10-04 05:45:47

标签: mysql constraints ddl

我对特定的键以及如何引用它们有疑问。我正在学习,这将非常有帮助,谢谢。

在SQL中,这些样式之间有什么区别?

此外,在创建复合主键时,外键还必须具有复合外键以匹配复合主键。在第一个表中,如果我在规范中添加了唯一性而不创建外部组合,则可以引用它,但是如果删除唯一性,则由于它是一个组合,因此无法引用主键。为什么添加唯一可以让我在没有外部组合键的情况下引用第一个表中的组合主键?另外,为什么可以在组合键中添加UNIQUE键?

此外,这是否类似于在第二张表中添加UNIQUE KEY复合物?第三张表不允许我引用该表,因为我必须有一个复合外键。

SUPPLY_CNT
df.loc[(df['Days'] == 0) & ((df['SUPPLY_CNT'].notna()))].groupby('ID')['Days'].count()
ID
1561    3
2412    2
7848    1

1 个答案:

答案 0 :(得分:0)

PRIMARY KEY (CourseN, `Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)

在此构造中,您将使用列(CourseN, Quarter DayTime)构成复合主键。这意味着这三列的值的任何组合在表中必须是唯一的。另外,您指示CourseN是引用表Course中同义词列的外键,因此引用表CourseN中列LocationNTime的每个值都必须存在于引用的表Course

这看起来像是有效的设置,其中LocationNTime就像Course的从属表(例如子表或类似表)。


PRIMARY KEY (CourseN),
UNIQUE KEY(`Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)

在这里,CourseN是表的主键,因此此列中的每个值都必须是唯一的。但这也是Course的外键。从规范化的角度来看,这真的没有意义:如果LocationNTime中的每个记录都与Course中的唯一记录相关,那么为什么要创建两个表而不是将所有数据存储在单个记录中? Course

最重要的是,您正在(四分之一, DayTime)上创建唯一约束,从而表明这些列中值的组合是唯一的。

这种设计看起来有缺陷。


考虑以下数据集:

CourseN    Quarter    DayTime
1          1          14:00:00
1          2          14:10:00
1          3          14:00:00
1          4          14:10:00

第一个设计将允许该数据集,而第二个设计则不允许,因为这些是CourseN中的重复项。也不允许以下数据集,因为(Quarter, DayTime)中有重复项:

CourseN    Quarter    DayTime
1          1          14:00:00
2          2          14:10:00
3          1          14:00:00
4          2          14:10:00

我相信第一个设计可能就是您所需要的。


最后:您似乎认为具有外键约束(此处为LocationNTime(CourseN))的列需要为UNIQUE:不是这种情况。它唯一需要的就是索引(无论如何,当您声明索引时,MySQL都会在后台为您创建索引)。外键(此处为Course(CourseN))所引用的列需要唯一。