Advent Calendar 21日目 MySQL において1つのクエリでカラムの値を入れ替える方法

たぶん滅多に使うことはないと思うけれども、必要になって調べたことがあったので掲載。

sample table
CREATE TABLE `sample` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `a` int(10) default NULL,
  `b` int(10) default NULL,
  PRIMARY KEY  (`id`)
);
mysql> select * from sample;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |    1 |    2 |
|  2 |    3 |    4 |
|  3 |    5 |    6 |
|  4 |    7 |    8 |
|  5 |    9 |   10 |
+----+------+------+
5 rows in set (0.00 sec)

例えばこんなテーブルがあった時、

カラム a と カラム b の値を入れ替えたい場合は、以下のようなクエリを発行すればいい。

入れ替えクエリ
UPDATE sample SET a = IF((@tmp:=a), b, b), b = @tmp;
実行結果
mysql> UPDATE sample SET a = IF((@tmp:=a), b, b), b = @tmp;
Query OK, 5 rows affected (0.02 sec)
Rows matched: 5  Changed: 5  Warnings: 0

mysql> select * from sample;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |    2 |    1 |
|  2 |    4 |    3 |
|  3 |    6 |    5 |
|  4 |    8 |    7 |
|  5 |   10 |    9 |
+----+------+------+
5 rows in set (0.00 sec)

あれ? このネタの方がカジュアルじゃなかった!?