Merge записей с CASCADE ForeignKey

181
21 июля 2018, 09:10

Допустим есть две записи в таблице user. Так как это одна из основных таблиц в системе, на которой завязанны множество других таблиц, триггеров и прочих связей через user_id Как правильней обьединить две записи в этой таблице? Чтоб во всех связанных таблицах поменялся user_id?

Пример

CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `user` (`user_id`, `name`) VALUES
    (76, 'USER-76'),
    (79, 'USER-79');
CREATE TABLE IF NOT EXISTS `user_contact` (
  `user_id` int(11) NOT NULL,
  `type_enum` enum('PHONE','EMAIL','SKYPE') COLLATE utf8_unicode_ci NOT NULL,
  `value` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`user_id`,`type_enum`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `FK_user_contact_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `user_contact` (`user_id`, `type_enum`, `value`) VALUES
    (76, 'PHONE', '76767676'),
    (76, 'EMAIL', 'test76@gmail.com'),
    (79, 'PHONE', '79797979'),
    (79, 'SKYPE', 'skype-79');

http://www.sqlfiddle.com/#!9/866d5f/1

Тоесть я хочу подмержить все записи 79-го пользователя в 76-го При возникновении конфликта, значения из копируемой записи игнорируются

В голову пришло только такое

SET @FROM_ID = 79;
SET @TO_ID = 76;
START TRANSACTION;
SET foreign_key_checks = 0;
DELETE FROM `user` WHERE user_id=@TO_ID;
SET foreign_key_checks = 1;
UPDATE `user` SET user_id=@TO_ID WHERE user_id=@FROM_ID;
COMMIT;

Но это только в том случае когда нет конфликтов.

В результате должно получиться следующее

SELECT
  u.user_id,
  u.name,
  uc.type_enum,
  uc.value
FROM `user` u
  LEFT JOIN user_contact uc USING (user_id);
+---------+---------+-----------+-------------------+
| user_id |  name   | type_enum |      value        |
+---------+---------+-----------+-------------------+
|      76 | USER-76 | PHONE     | 76767676          |
|      76 | USER-76 | EMAIL     | test76@gmail.com  |
|      76 | USER-76 | SKYPE     | skype79           |
+---------+---------+-----------+-------------------+

Можно конечно сходить во все связанные таблицы, и с помощью PHP обновить записи там, но это нужно найти все связи и писать целую систему для этого. Может есть способ попроще?

Answer 1

Так может просто айдюки прописать у связанных таблиц?

update 'linked_table' set userID=firstUser where userID=secondUser

И если при этом происходит какой-то эксепшен, то и фиг с ним. А по завершению, просто удаляете пользователя secondUser

READ ALSO
Почему тормозит INFORMATION_SCHEMA

Почему тормозит INFORMATION_SCHEMA

Собственно говоря есть у меня огромная база, на несколько террабайтХочу вытащить FK для нее, где-то таким запросом

240
Запрос всех значений полей MySQL

Запрос всех значений полей MySQL

Имеется таблица product с большим количеством полей

217
SQL запросы космические пираты [закрыт]

SQL запросы космические пираты [закрыт]

Помогите с задачкой, пожалуйстаЯ даже понять не могу, как связываются таблицы :(

227
Slick slider: увеличение центральной картинки

Slick slider: увеличение центральной картинки

Нужно реализовать слайдер как на картинкеСделала при помощи slick слайдера, но нигде в настройках не нашла строчки, что бы картинка в центре...

682