Как мне объединить две избыточные записи в таблице MySQL, сохранив все отношения PK / FK?

Допустим, у меня есть таблица клиентов со следующими полями и записями:

id   first_name   last_name   email                  phone
------------------------------------------------------------------------
1    Michael      Turley      mturley@whatever.com   555-123-4567
2    John         Dohe        jdoe@whatever.com      
3    Jack         Smith       jsmith@whatever.com    555-555-5555
4    Johnathan    Doe                                123-456-7890

Есть несколько других таблиц, например заказов , вознаграждений , квитанций , у которых есть внешние ключи customer_id , относящиеся к этой таблицы customers.id .

Как вы можете видеть, мои пользователи, обладая безграничной мудростью, создали повторяющиеся записи для Джона Доу с несогласованным написанием и отсутствующими данными. Администратор замечает это, выбирает клиентов 2 и 4 и нажимает «Объединить». Затем им предлагается выбрать правильное значение для каждого поля и т. Д., И мой PHP определяет, что объединенная запись должна выглядеть следующим образом:

id   first_name   last_name   email                  phone
------------------------------------------------------------------------
?    John         Doe         jdoe@whatever.com      123-456-7890

Предположим, мистер Доу разместил несколько заказов, заработал вознаграждения, сгенерировал квитанции ... но некоторые из них были связаны с идентификатором 2, а некоторые - с идентификатором 4. Объединенная строка должна соответствовать всем внешним ключам в других таблицах, которые соответствуют исходным строкам.

Вот где я не знаю, что делать.Мой инстинкт таков:

DELETE FROM customers WHERE id = 4;

UPDATE customers
SET first_name = 'John',
    last_name  = 'Doe',
    email      = 'jdoe@whatever.com',
    phone      = '123-456-7890'
WHERE id = 2;

UPDATE orders, rewards, receipts
SET customer_id = 2
WHERE customer_id = 4;

Я думаю, что это сработает, но если позже я добавлю еще одну таблицу с внешним ключом customer_id, я должен не забыть вернуться и добавить эту таблицу во второй запрос UPDATE в моем слиянии функции или риск потери целостности.

Должен быть способ сделать это лучше.

8
задан Mike Turley 8 March 2011 в 19:00
поделиться