【发布时间】:2013-11-15 16:52:44
【问题描述】:
我有一个具有以下架构的 MySQL 表
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(7) | NO | UNI | NULL | auto_increment |
| title | varchar(20) | NO | PRI | NULL | |
+-------+-------------+------+-----+---------+----------------+
这是里面的内容。
+----+-------+
| id | title |
+----+-------+
| 1 | a |
| 2 | b |
+----+-------+
问题:我想在单个查询中交换值,以便表格现在变成
+----+-------+
| id | title |
+----+-------+
| 1 | b |
| 2 | a |
+----+-------+
我试过了:UPDATE myTable SET title = CASE id WHEN 1 THEN "b" WHEN 2 THEN "a" END;
但它给了我一个错误ERROR 1062 (23000): Duplicate entry 'b' for key 'PRIMARY'
我该怎么办?
在其中一个链接中找到的解决方案似乎是目前唯一的方法,但我仍在寻找更好的解决方案
START TRANSACTION;
UPDATE prime SET title = CASE id WHEN 1 THEN "$b" WHEN 2 THEN "$a" END;
UPDATE prime SET title = CASE id WHEN 1 THEN SUBSTRING(title,2) WHEN 2 THEN SUBSTRING(title,2) END;
COMMIT;
【问题讨论】:
-
id应该是主键并且title是唯一的。您在表定义中使用相反的方式。 -
标准的解决方案是将'b'推送到'c',然后将'a'推送到'b',再将'c'推送到'a'。这是一个选择吗?
-
@Strawberry 不完全是。我需要在单个查询中执行此操作。
-
how to swap values of two rows in mysql without violating unique constraint? 的可能重复项(但交换 VARCHAR 值比交换 INT 值要复杂一些。)
标签: mysql