php – 如何在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

还有其他几个表,例如订单,奖励,具有与此表的customers.id相关的外键customer_id的收据.

正如您所看到的,我们的用户以他们无限的智慧为John Doe创建了重复记录,并且拼写不一致且数据丢失.管理员注意到这一点,选择客户2和4,然后单击“合并”.然后提示他们为每个字段选择哪个值是正确的等等,我的PHP确定合并的记录应如下所示:

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

让我们假设Doe先生已经下了几个订单,获得了奖励,生成了收据……但是其中一些已经与id 2相关联,而且有些已经与id 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查询,否则可能会失去完整性.

必须有一个更好的方法来做到这一点.

作为我评论的更新:
use information_schema;
select table_name from columns where column_name = 'customer_id';

然后遍历生成的表并相应地更新.

就个人而言,我会使用你的本能解决方案,因为如果有包含需要免除的customer_id列的表,这可能是危险的.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...