Mariadb

如何更改外鍵中的引用?

  • September 16, 2022

重命名一些表後,出現以下錯誤:

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`))

原因是需要將裡面的associationsREFERENCES改成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_2FOREIGN KEY ( uid) REFERENCES users ( uid);

為防止這種情況,請使用上述正確的鎖定語法

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