如何在没有重复的情况下批量更新 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};
我有一个数据库如下
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};