php - 如何合并 MySQL 表中的两条冗余记录,维护所有 PK/FK 关系?

标签 php mysql merge foreign-keys redundancy

假设我有一个表 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

还有其他几个表,比如ordersrewardsreceipts都有外键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/

相关文章:

php - 从 rss 提要中读取 cdata

php - 如何使用 Drupal `db_select()` 方法转换查询?

mysql - datetime(6) 适用于 XAMPP,但不适用于最新的 Ubuntu MySQL 服务器

mysql - 意外的字符串转换为十六进制

r - left_join (dplyr) 下一个可用日期

git - 删除虚假的提交父指针

php - 您无权访问此服务器上的/folder/index.php。 Apache/2.2.22 (Ubuntu) 服务器在 localhost 端口 80

php 回显尖括号

PHP CURL 到 CodeIgniter Controller

pdf - 合并拆分 PDF 后大小增加