私は同じことに対処する必要がありました。調査結果を要約します。
-
UPDATE table SET X=Y, Y=X
両方の値をYに設定するだけなので、アプローチは明らかに機能しません。 -
一時変数を使用するメソッドは次のとおりです。 http://beerplaのコメントからAntonyに感謝します.net / 2009/02/17 / swapping-column-values-in-mysql / 「ISNOTNULL」の調整用。これがないと、クエリは予期せず機能します。投稿の最後にあるテーブルスキーマを参照してください。このメソッドは、値の1つがNULLの場合、値を交換しません。この制限がない方法#3を使用してください。
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
このメソッドは、Dipinによって提供されましたが、 http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ 。これが最もエレガントでクリーンなソリューションだと思います。 NULL値と非NULL値の両方で機能します。
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
私が思いついた別のアプローチはうまくいくようです:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
基本的に、1番目のテーブルは更新されるテーブルであり、2番目のテーブルは古いデータをプルするために使用されます。
このアプローチでは主キーが存在する必要があることに注意してください。
これは私のテストスキーマです:
CREATE TABLE `swap_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`x` varchar(255) DEFAULT NULL,
`y` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `swap_test` VALUES ('1', 'a', '10');
INSERT INTO `swap_test` VALUES ('2', NULL, '20');
INSERT INTO `swap_test` VALUES ('3', 'c', NULL);