我有下表:
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
的行保持不变
答案 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
;