找到重复键时,使用MySQL触发器更新另一个表

时间:2011-06-26 01:29:07

标签: mysql triggers

一直在摸不着头脑,希望你们中的一个善良的人,并指导我解决这个问题。

我有一个客户的mysql表,它包含很多数据,但是出于这个问题的目的,我们只需要担心4列'ID','Firstname','Lastname','Postcode'< / p>

问题是,该表包含许多重复的客户。

正在创建一个新表,其中每个客户都是唯一的,对我们而言,我们根据“名字”,“姓氏”和“邮政编码”确定一个独特的客户

但是,(这是重要的一点)我们需要确保每个新的“唯一”客户记录也可以与原始表中该客户的原始多个条目相匹配。

我认为最好的方法是拥有第三个表,它有'NewUniqueID','OldCustomerID'。因此,我们可以在此表中搜索“NewUniqueID”=“123”,并在适当的时候返回多个“OldCustomerID”值。

我希望使用触发器和重复键语法来完成这项工作。那么会发生什么如下:

  1. 运行旧客户表并将其插入新的唯一表中运行查询。 (标准的“插入选择”查询)

  2. 在重复键上继续添加记录,但在第三个表中添加一个条目,注意与我们试图插入的记录的'OldCustomerID'一起欺骗的'NewUniqueID'。

  3. 希望这是有道理的,如果不清楚,我道歉。 我欢迎并感谢对此的任何想法! 非常感谢 杰森

1 个答案:

答案 0 :(得分:1)

因为每个旧客户只有一个新客户(而不是相反),“正确”的设计会在旧表中添加一个新列,比如说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;