![](/img/trans.png)
[英]how to make a composite foreign key (not composite primary key) as unique in 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.