我对特定的键以及如何引用它们有疑问。我正在学习,这将非常有帮助,谢谢。
在SQL中,这些样式之间有什么区别?
此外,在创建复合主键时,外键还必须具有复合外键以匹配复合主键。在第一个表中,如果我在规范中添加了唯一性而不创建外部组合,则可以引用它,但是如果删除唯一性,则由于它是一个组合,因此无法引用主键。为什么添加唯一可以让我在没有外键的情况下引用第一个表中的组合主键?另外,为什么我可以在组合键中添加UNIQUE键?
而且,这是否类似于在第二张表中添加UNIQUE KEY复合物?第三张表不允许我引用该表,因为我必须有一个复合外键。
CREATE TABLE college.LocationNTime(
CourseN INT,
`Quarter` VARCHAR(30) UNIQUE,
DayTime VARCHAR(30) UNIQUE,
RoomN INT,
PRIMARY KEY (CourseN, `Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)
);
CREATE TABLE college.LocationNTime(
CourseN INT,
`Quarter` VARCHAR(30),
DayTime VARCHAR(30),
RoomN INT,
PRIMARY KEY (CourseN),
UNIQUE KEY(`Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)
);
CREATE TABLE college.LocationNTime(
CourseN INT,
`Quarter` VARCHAR(30),
DayTime VARCHAR(30),
RoomN INT,
PRIMARY KEY (CourseN, `Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)
);
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
中的单个记录中?
此外,您正在(
Quarter , DayTime)
上创建唯一约束,因此表示这些列中值的组合是唯一的。
此设计看起来有缺陷。
请考虑以下数据集:
CourseN Quarter DayTime
1 1 14:00:00
1 1 14:10:00
1 2 14:00:00
1 2 14:10:00
第一个设计将允许该数据集,而第二个则不允许(因为CourseN
中存在重复项,并且由于(Quarter, DayTime)
中存在重复项。我相信第一个设计可能正是您所需要的。
最后:您似乎认为具有外键约束的列(此处为LocationNTime(CourseN)
)必须为UNIQUE
:并非如此。它唯一需要的就是索引(无论如何,当您声明索引时,MySQL都会在后台为您创建索引)。这是外键(此处为Course(CourseN)
)引用的列,需要唯一。