Используйте триггер MySQL для обновления другой таблицы при обнаружении дублирующего ключа - PullRequest
1 голос
/ 26 июня 2011

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

У меня есть таблица клиентов mysql, она содержит много данных, но для решения этого вопроса нам нужно беспокоиться только о 4 столбцах: «ID», «Имя», «Фамилия», «Почтовый индекс»

Проблема в том, что в таблице много дублированных клиентов.

Создается новая таблица, в которой каждый клиент уникален, и для нас мы решаем, что уникальный клиент основан на имени, фамилии и почтовом индексе

Однако (это важный бит) нам нужно убедиться, что каждая новая «уникальная» запись клиента также может быть сопоставлена ​​с исходными несколькими записями этого клиента в исходной таблице.

Я считаю, что лучший способ сделать это - иметь третью таблицу с NewUniqueID, OldCustomerID. Таким образом, мы можем найти в этой таблице «NewUniqueID» = «123», и она при необходимости вернет несколько значений «OldCustomerID».

Я надеюсь заставить это работать с использованием триггера и синтаксиса ключа на дубликате. Итак, что произойдет так:

  1. Запрос выполняется, беря старую таблицу клиентов и вставляя ее в новую уникальную таблицу. (Стандартный запрос на вставку Select)

  2. При дублировании ключа продолжайте добавлять записи, но добавьте одну запись в третью таблицу, отметив «NewUniqueID», который дублировался вместе со «OldCustomerID» записи, которую мы пытались вставить.

Надеюсь, это имеет смысл, мои извинения, если неясно. Я приветствую и ценю любые мысли по этому поводу! Большое спасибо Jason

1 Ответ

1 голос
/ 26 июня 2011

Поскольку у каждого старого клиента ровно один новый клиент (а не наоборот), «правильный» дизайн будет добавлять новый столбец к старой таблице, скажем, new_customer_id:

alter table old_customer add new_customer_id int;

После создания новых записей о клиентах:

insert into new_customer (first_name, last_name, postcode)
select distinct first_name, last_name, postcode
from old_customer;

Тогда вы можете заполнить новый столбец следующим образом:

update old_customer oc set
new_customer_id = (
    select id 
    from new_customer
    where first_name = oc.first_name
    and last_name = oc.last_name
    and postcode = oc.postcode);

При желании вы можете не использовать старые записи с мусорными данными - они будут иметь new_customer_id = null;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...