如何更改外鍵中的引用?
重命名一些表後,出現以下錯誤:
MariaDB [testdb]> INSERT INTO user_events (date, uid, operation, info) VALUES('2022-09-15','xyz','create',NULL); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails `testdb`.`user_events`, CONSTRAINT `user_events_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `associations` (`uid`))
原因是需要將裡面的
associations
表REFERENCES
改成users
.實現這一目標的最簡單方法是什麼?
您可以遵循三個步驟。
1. Identify the foreign keys names from the tables
在您的範例
show create table user_events
中,將給出外鍵名稱。您可以使用以下查詢找到架構的所有外鍵名稱:
SELECT CONSTRAINT_NAME,TABLE_NAME FROM information_schema.TABLE_CONSTRAINTS WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'world';
2. Drop the foreign key constraint
如果您的表引擎是Innodb ,請使用以下查詢刪除外鍵:
SET autocommit=0; LOCK TABLES user_events WRITE; ALTER TABLE user_events DROP FOREIGN KEY user_events_ibfk_1; COMMIT; UNLOCK TABLES;
3. Recreate the foreign key constraint
SET autocommit=0; LOCK TABLES user_events WRITE; ALTER TABLE user_events ADD CONSTRAINT `user_events_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`); COMMIT; UNLOCK TABLES;
注意。第 2 步和第 3 步可以合併為一個查詢,但外鍵名稱必須與刪除的名稱不同
SET autocommit=0; LOCK TABLES user_events WRITE; ALTER TABLE user_events DROP FOREIGN KEY user_events_ibfk_1, ADD CONSTRAINT `user_events_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`)); COMMIT; UNLOCK TABLES;
對里克評論的回應
我懷疑是否需要鎖定/解鎖。Ergest,你知道他們需要嗎?
來自 docs Online DDL 限制
執行就地線上 DDL 操作時,執行 ALTER TABLE 語句的執行緒應用從其他連接執行緒在同一個表上同時執行的 DML 操作的線上日誌。應用 DML 操作時,可能會遇到重複鍵條目錯誤(ERROR 1062 (23000): Duplicate entry),即使重複條目只是臨時的並且將由線上日誌中的稍後條目恢復。
在沒有鎖定表的情況下面臨的錯誤(並非總是如此),大部分時間發生在大表上,這將導致 alter 語句失敗:
錯誤 1062:鍵 ‘PRIMARY’ SQL 語句的重複條目 ‘’:ALTER TABLE user_events DROP FOREIGN KEY user_events_ibfk_1, ADD CONSTRAINT
user_events_ibfk_2
FOREIGN KEY (uid
) REFERENCESusers
(uid
);為防止這種情況,請使用上述正確的鎖定語法