Каков наилучший способ слияния записей с внешними ключами. Существует много тем, посвященных «объединению записей», но они в основном выбирают и группируют строки. Это, очевидно, может быть сделано в коде, но безопасное решение для базы данных должно быть более эффективным.mysql merge primary key
Это лучшее решение, о котором я могу думать. Транзакция в хранимой процедуре. Отключить проверки внешнего ключа. Обновить все внешние ключи. Удалить дубликат записи.
У кого-нибудь есть лучший способ сделать это? Или есть ли какие-либо другие проверки, которые также необходимо выполнить для обеспечения целостности ключа?
пример базы данных - непроверенный
пользователя John Doe '(id_user = 2, дублирует ID = 5) случайно сделал вторую учетную запись и хочет объединить все данные с исходной учетной записью.
tbl_users
id_user | first_name | last_name
1 | John | Doe
2 | Jane | Doe
3 | john | Smith
4 | Jane | Smith
5 | John | Doe
6 | Blah | Meh
tbl_likes
id_user | apple | orange
2 | 1 | 0
5 | 1 | 1
tbl_random
id_user | col1 | col2
1 | Aaa | Bbb
3 | Ccc | Ddd
5 | Eee | Fff
DELIMITER $$
CREATE PROCEDURE `tns_merge_user` (IN id_user_old INT, IN id_user_new INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;
START TRANSACTION;
# Prevent other queries modifying tables during merge
LOCK TABLES tbl_users WRITE;
LOCK TABLES tbl_likes WRITE;
LOCK TABLES tbl_random WRITE;
#Disable foreign key checks
SET FOREIGN_KEY_CHECKS=0;
# Perform merge queries on related tables
UPDATE tbl_likes SET id_user = id_user_new;
UPDATE tbl_random SET id_user = id_user_new;
# Delete duplicate user record
DELETE FROM tbl_users WHERE id_user = id_user_old;
# Re-enable foreign key checks
SET FOREIGN_KEY_CHECKS=1;
UNLOCK TABLES;
COMMIT;
END
$$