我試圖理解定義表的語法,我注意到列定義包含一個選項,用于指示該列參考另一個表中的列。
如果我已經可以在這里定義它,我是否還需要明確定義一個 FOREIGN KEY 約束再次指定該列?為什么?
因為我想作為列約束添加的 REFERENCE 定義應該已經考慮到該列是外鍵的事實(因為它正在參考另一個表)。
為清楚起見的示例代碼:
一個)
create table SAMPLE (
sample_id INT PRIMARY KEY,
client_id INT REFERENCES CLIENT (client_id)
);
b)
create table SAMPLE (
sample_id INT PRIMARY KEY,
client_id INT NOT NULL,
CONSTRAINT fk_sample_client
FOREIGN KEY (client_id) REFERENCES CLIENT (client_id)
);
定義 (a) 是否確保 clientId 被標識為外鍵,與定義 (b) 的方式相同嗎?
uj5u.com熱心網友回復:
REFERENCES 作為列定義的一部分被忽略。
重要的
對于熟悉 ANSI/ISO SQL 標準的用戶,請注意,包括 InnoDB 在內的任何存盤引擎都不會識別或強制執行參考完整性約束定義中使用的 MATCH 子句。使用顯式 MATCH 子句沒有指定的效果,還會導致 ON DELETE 和 ON UPDATE 子句被忽略。由于這些原因,應避免指定 MATCH。
SQL 標準中的 MATCH 子句控制在與主鍵比較時如何處理復合(多列)外鍵中的 NULL 值。InnoDB 本質上實作了 MATCH SIMPLE 定義的語意,它允許外鍵全部或部分為 NULL。在這種情況下,允許插入包含此類外鍵的(子表)行,并且與參考的(父)表中的任何行都不匹配。可以使用觸發器實作其他語意。
此外,MySQL 要求對參考的列進行索引以提高性能。但是,InnoDB 不強制要求將參考的列宣告為 UNIQUE 或 NOT NULL。對于 UPDATE 或 DELETE CASCADE 等操作,對非唯一鍵或包含 NULL 值的鍵的外鍵參考的處理沒有明確定義。建議您使用僅參考唯一(或 PRIMARY)和 NOT NULL 的鍵的外鍵。
MySQL 決議但忽略“行內 REFERENCES 規范”(如 SQL 標準中所定義),其中參考被定義為列規范的一部分。MySQL 僅在指定為單獨的 FOREIGN KEY 規范的一部分時才接受 REFERENCES 子句。有關詳細資訊,請參閱第 1.7.2.3 節,“外鍵約束差異”。
來源:https ://dev.mysql.com/doc/refman/8.0/en/create-table.html
uj5u.com熱心網友回復:
正如Simon 分享的那樣,列定義中的行內參考被 mySQL 忽略,此鏈接進一步解釋了原因。
定義一個列以使用 REFERENCES tbl_name(col_name) 子句沒有實際效果,僅作為對您的備注或注釋,您當前定義的列旨在參考另一個表中的列。
簡單地說,語法仍然只會創建列;它不會將其指定為外鍵或對其進行任何檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/516888.html
上一篇:比較兩個增值稅號
下一篇:右連接不顯示“不完整”資料的條目
