Mysql
MySQL抱怨密鑰存在但我找不到它
我有一個帶有大量外鍵約束的大型(模式和數據)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";
一些參考資料: