Mysql ERROR 1062(23000):重复输入。更新不会违反唯一约束的行

时间:2016-12-19 15:19:37

标签: mysql sql-update constraints

我有下表:

 CREATE TABLE `user_favourite_posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_at` datetime NOT NULL
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_post_unique` (`user_id`,`post_id`))

我正在尝试使用(1000,1001)中的post_id更新所有行到post_id = 1005,如下所示:

update user_posts set post_id=1005 where post_id in(1000, 1001);

但由于user_post_unique约束,我收到以下错误:

  

ERROR 1062(23000):密钥' user_post_unique'

重复输入1005

好。这是按预期工作的。

但我想更新所有不违反约束的行。有可能只用一句话吗?我无法在不删除某些mysql标志或使用临时表的情况下弄清楚如何执行此操作,因为我无法在子查询中使用相同的表。

更新:

一个例子,有以下数据

+-------+---------+---------+
| id    | user_id | post_id |
+-------+---------+---------+
|  4581 |       2 | 1001    |
|  9739 |       2 | 1005    |
|  7324 |       3 | 1001    |
+-------+---------+---------+

我想毫无问题地更新所有行,因此id 4581的行保持不变

1 个答案:

答案 0 :(得分:2)

我认为这应该有效:

update user_posts a
    left join user_posts b ON b.post_id IN (1000,1001,1005) AND b.user_id = a.user_id AND b.post_id > a.post_id
set a.post_id = 1005 
where 
    a.post_id in (1000, 1001)
AND b.id IS NULL
;