如何在没有重复的情况下批量更新 mysql 数据库?

How to bulk update mysql database without having duplicates?

我有一个数据库如下

CREATE TABLE `user_relationships` (
  `id` int(11) NOT NULL,
  `user_id` int(20) UNSIGNED NOT NULL,
  `relationship` varchar(50) NOT NULL,
  `institution_id` int(20) UNSIGNED NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我有如下数据

--------------------------------------------
id | user_id | relationship | institution_id
--------------------------------------------
 1 |   12    |is_working_at |    24
--------------------------------------------  
 2 |   12    |was_working_at|    23
--------------------------------------------
 3 |   12    |was_working_at|    55
--------------------------------------------
 4 |   12    |is_trained_at |    55
--------------------------------------------

现在我有一个场景,我想将机构 55 (child_id) 合并到机构 23 (parent_id)。为此,我 运行 以下查询

UPDATE user_relationships 
SET institution_id='{$parent_id}' 
WHERE (
    relationship IN ('was_working_at', 'is_working_at', 'is_trained_at') AND
    institution_id = {$child_id} 
) 

这工作正常,除非用户和机构之间已经存在相同的关系。在那种情况下,我收到类似

的错误

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '12-was_working_at-23' for key 'user_id'

我该如何解决这个问题?是否有编写 sql 查询的有效方法,只有在先前不存在相同关系时才会创建条目?

你可以UPDATE IGNORE:

UPDATE IGNORE user_relationships 
SET institution_id='{$parent_id}' 
WHERE
    relationship IN ('was_working_at', 'is_working_at', 'is_trained_at') AND
    institution_id = {$child_id};

使用 IGNORE 修饰符,即使在更新过程中发生错误,更新语句也不会中止。不更新在唯一键值上发生 duplicate-key 冲突的行。更新为会导致数据转换错误的值的行改为更新为最接近的有效值。

但是在这次更新之后,您必须决定哪些内容应该与未更新的行一起删除。可能您需要使用以下方法删除它们:

DELETE FROM user_relationships 
WHERE
    relationship IN ('was_working_at', 'is_working_at', 'is_trained_at') AND
    institution_id = {$child_id};