假设我有一个表 customers
,其中包含以下字段和记录:
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
还有其他几个表,比如orders
,rewards
,receipts
都有外键customer_id
相关添加到此表的 customers.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 查询,否则可能会丢失完整性.
必须有更好的方法来做到这一点。
最佳答案
我从谷歌来到这里,这是我的 2 美分:
SELECT `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE REFERENCED_TABLE_SCHEMA='DATABASE'
AND REFERENCED_TABLE_NAME='customers'
AND REFERENCED_COLUMN_NAME='customer_id'
为保险起见添加数据库(您永远不会知道何时有人复制了数据库)。
这里我们不查找列名,而是查看外键本身
如果您更改删除限制以限制在删除/迁移子项之前无法删除任何内容
关于php - 如何合并 MySQL 表中的两条冗余记录,维护所有 PK/FK 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5237005/