簡體   English   中英

mySQL 組合鍵、主鍵、唯一鍵和對組合鍵的引用

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

我對特定鍵以及如何引用它們有疑問。 我正在學習,這將非常有幫助,在此先感謝您。

在 SQL 中,這些 styles 有什么區別?

此外,在創建復合主鍵時,外部還必須有一個復合外鍵來匹配復合主鍵。 在第一個表中,如果我在規范中添加唯一而不創建外部復合,我可以引用它,但是如果我刪除唯一我不能引用主鍵,因為它是一個復合。 為什么添加唯一性允許我在沒有外部復合鍵的情況下引用第一個表中的復合主鍵? 另外,為什么我可以在復合鍵中添加唯一鍵?

此外,這是否類似於在第二個表中添加 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中的同義詞列的外鍵,因此引用表LocationNTime中列CourseN的每個值都必須存在於引用表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          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) )引用的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM