Mysql

MariaDB 處理同時作為外鍵的複合唯一索引

  • February 5, 2020

我對 MariaDB(可能還有 MySQL)如何處理也是外鍵的複合唯一索引有一個可能的問題。不確定這是否是設計使然,如果是,為什麼會這樣工作。

我有一個名為 action_contact 的表。它有一個指向“action”表的外鍵 action_id 和指向“contact”表的 contact_id。兩者都是無符號的 bigint 列。我也需要這兩個欄位是唯一索引。如果我不添加唯一索引,這兩個欄位預設也是數據庫中的索引,這很好。但是,一旦我添加了唯一的複合索引 (action_id, contact_id) - 它已添加到數據庫中,但 contact_id 的正常索引仍然存在,並且 action_id 的正常索引被刪除。外鍵仍然存在,因為它們應該存在。這是正常行為嗎?

這是記錄在案的行為

MySQL 需要外鍵和引用鍵上的索引,以便外鍵檢查可以快速且不需要表掃描。在引用表中,必須有一個索引,其中外鍵列按相同順序列為第一列。如果引用表不存在,則會在引用表上自動創建此類索引。如果您創建另一個可用於強制外鍵約束的索引,則此索引可能會在稍後被靜默刪除。index_name,如果給定,如前所述使用。

允許在同一列上使用多個索引,但已棄用(因為它是多餘的 - 幾乎沒有非唯一鍵可以做的唯一索引不能做的事情),並且將來可能會出錯(​​儘管可能不是針對不同的索引像這種情況下的類型)。

為了防止混淆,我的建議是從一開始就創建唯一索引(或任何足以使用自定義名稱的顯式索引)。我同意你的觀點,這可能會讓人感到困惑,所以查看手冊總是一個好主意,我相信目前的實現從控制和優化角度之間的折衷來看是有意義的。:-)

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