Mysql

MySQL抱怨密鑰存在但我找不到它

  • December 1, 2018

我有一個帶有大量外鍵約束的大型(模式和數據)MySQL 數據庫。最近我發現某些腳本無法創建表,因為給定名稱的鍵已經存在。

我將問題追溯到以下內容:

如果我執行這樣的東西:

CREATE TABLE `foo` (
 `bar` int UNSIGNED NOT NULL,
 CONSTRAINT `BAZ` FOREIGN KEY (`bar`) REFERENCES `qux` (`bar`) ON DELETE CASCADE ON UPDATE CASCADE
);

我越來越:

錯誤 1022 (23000):無法寫入;表 ‘foo’ 中的重複鍵

但如果我:

SELECT *
 FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = "my_db"
  AND CONSTRAINT_NAME LIKE "BAZ";

我得到一個空集。

我也嘗試轉儲架構並在那裡搜尋“BAZ”,但一無所獲。

創建一個命名外鍵的表,除了“BAZ”。

怎麼會這樣?

您可能在數據庫中的某個其他表上有一個外鍵索引,該表具有相同的約束名稱,因此會導致命名空間衝突。

如果您正在使用所有 InnoDB 表(正如您在 2017 年應該使用的那樣),請嘗試使用以下方法找到有問題的表:

SELECT t.name
 FROM information_schema.innodb_sys_indexes i
 JOIN information_schema.innodb_sys_tables t
USING (table_id)
 WHERE i.name = 'BAZ';

或者這也可能有效:

SELECT *
FROM information_schema.innodb_sys_foreign
WHERE id REGEXP 'BAZ$';

您是否有機會配置為不區分大小寫?

以下是否返回任何記錄:

SELECT   CONSTRAINT_SCHEMA,
        CONSTRAINT_NAME
FROM     information_schema.REFERENTIAL_CONSTRAINTS
where    lower(CONSTRAINT_SCHEMA) like "my_db"
and      lower(CONSTRAINT_NAME) like "baz";

一些參考資料:

mysql錯誤程式碼1022表中的重複鍵

MySQL中不區分大小寫的約束名稱

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