【发布时间】:2011-07-11 08:32:13
【问题描述】:
假设我有一个表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 查询中,否则可能会失去完整性.
必须有更好的方法来做到这一点。
【问题讨论】:
-
您可能会从 information_schema 中查询以 customer_id 作为列的表的列表,并相应地更新这些表。虽然这会带来其他风险。
标签: php mysql merge foreign-keys redundancy