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

mySQL Composite Key, Primary Key, Unique Key and References to the composite key

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

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

此外,在创建复合主键时,外键也必须有一个复合外键来匹配复合主键。在第一个 table 中,如果我在规范中添加了 unique 而没有创建外部复合,我可以引用它,但是如果我删除了 unique,我就无法引用主键,因为它是一个复合。为什么添加 unique 允许我在没有外部复合键的情况下引用第一个 table 中的复合主键?另外,为什么我可以在组合键中添加唯一键?

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

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) 的复合主键。这意味着这三列的值的任何组合在 table 中必须是唯一的。此外,您指出 CourseN 是引用 table Course 中同义词列的外键,因此您引用 table 中列 CourseN 的每个值 LocationNTime 必须出现在引用的 table Course.

这看起来像是一个有效的设置,其中 LocationNTime 就像 Course 的从属 table(例如 child table 或 the-like).


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

这里,CourseN是table的主键,所以这一列的每个值都必须是唯一的。但它也是 Course 的外键。这在规范化方面没有真正意义:如果 LocationNTime 中的每条记录都与 Course 中的唯一记录相关,那么为什么要创建两个 table 而不是存储所有数据在 Course?

的单条记录中

除此之外,您要在 (Quarter, 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))需要唯一。