我正在嘗試用簡單的示例撰寫一個 1-many 模式。我有一張表books映射到許多tags. (見下面的小提琴鏈接)
我想要的是 tags 表有一個外鍵到 books 表。我想我已經做到了:
CREATE TABLE IF NOT EXISTS `books` (
`id` int(6) unsigned NOT NULL,
`book_name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `tags` (
`tag_id` int(6) unsigned NOT NULL,
`tag` varchar(100) NOT NULL,
`book_id` int(6) unsigned NOT NULL,
PRIMARY KEY (`tag_id`)
);
我不明白兩者之間的區別:
`book_id` int(6) unsigned NOT NULL,
和
`book_id` int(6) unsigned NOT NULL REFERENCES `books`(`id`),
兩者都可以編譯并使用內部連接
http://sqlfiddle.com/#!9/612337/1
http://sqlfiddle.com/#!9/2043b8/3
那么片段之間有什么區別呢?
uj5u.com熱心網友回復:
https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html說:
MySQL 決議但忽略“行內 REFERENCES 規范”(如 SQL 標準中所定義),其中參考被定義為列規范的一部分。MySQL 僅在指定為單獨的 FOREIGN KEY 規范的一部分時才接受 REFERENCES 子句。
此語法創建一列;它不會創建任何型別的索引或鍵。
以這種方式使用時,REFERENCES 子句不會顯示在 SHOW CREATE TABLE 或 DESCRIBE 的輸出中:
也就是說,以下創建列book_id但不創建外鍵約束:
`book_id` int unsigned NOT NULL REFERENCES `books`(`id`),
你必須這樣做:
`book_id` int unsigned NOT NULL,
FOREIGN KEY (book_id) REFERENCES `books`(`id`),
多年前做出的決定是跳過將行內參考作為列選項實作。如果您為兩列或更多列創建外鍵,則無論如何都必須為 FOREIGN KEY 約束使用單獨的行。作為列定義的一部分的行內 REFERENCES 只是一種方便的快捷語法。
至少自 2004 年以來,語法已被決議但被忽略的事實已被報告為錯誤:
- https://bugs.mysql.com/bug.php?id=4919
- https://bugs.mysql.com/bug.php?id=17943
但是由于 MySQL 的可插拔存盤引擎架構,這個 bug 很難修復。SQL 語法決議獨立于存盤引擎處理,但約束的實作在存盤引擎內處理。SQL 決議器必須允許該語法,因為它不知道給定存盤引擎是否會忽略或支持該功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/438526.html
上一篇:如果動態路徑不存在,如何簽入Next.js并在簽入資料庫后回傳404?
下一篇:SQL多列相等
