Foreign-Key

SQL 是否在插入方面管理外鍵約束?

  • October 29, 2018

假設我有一個包含數據 A1 和 A2 的表 tbl1,其中 A1 是主鍵。然後我有另一個表 tbl2,其中包含數據 A3 和 A1,兩者都是主鍵,將 A1 引用為 tbl1 的外鍵。

我可以將一個元組插入到 tbl2 中,它的 A1 不在 tbl1 中嗎?SQL 會為我們管理這個錯誤嗎?或者在這種情況下會發生什麼?

正如評論中所討論的,違反外鍵約束將在大多數合法伺服器產品上產生錯誤。 但是,這僅是在物理定義了外鍵的情況下。

邏輯外鍵可以在沒有大多數引擎上稱為約束的強制執行器的情況下存在。我見過很多在紙上顯示關係的模式,但仔細檢查後發現邏輯關係實際上並沒有被外鍵約束強制執行。*當關係被正確索引時,*這對於檢查數據完整性以及查詢性能非常重要。

定義約束後,如果您違反該約束,以下每個伺服器產品都將生成錯誤。

MySQL

violation of FOREIGN KEY constraint "<name of constraint>" on table "<your table>".

注意 MySQL 目前僅支持 InnoDB 和 Falcon 引擎本地的外鍵約束

SQL 伺服器

statement conflicted with the FOREIGN KEY constraint "<name of contraint>". Conflict occured in database <your database>

Postgres

insert or update on table "<your table>" violates foreign key constraint "<constraint name>"

甲骨文

ORA-02291: integrity constraint (<schema.constraint>) violated - parent key not found

Sybase 的消息可能與 SQL Server 相同,我知道 DB2 強制執行它。 儘管錯誤消息沒有辨識約束,但 SQLite 也可以。

請注意,如果您在依賴密鑰的子項存在後嘗試刪除父項,這些引擎也會引發錯誤。

另一個提示

當您查看這些錯誤時,您還會選擇一個好的開發策略。以一種易於追溯所涉及的表的方式命名您的約束,因為幾乎所有這些表都標識了錯誤中的約束名稱。

引用自:https://dba.stackexchange.com/questions/27059