Saya hanya harus menghadapi hal yang sama dan saya akan merangkum temuan saya.
-
Tabel
UPDATE table SET X=Y, Y=X
pendekatan jelas tidak berfungsi, karena hanya akan menyetel kedua nilai ke Y. -
Berikut adalah metode yang menggunakan variabel sementara. Terima kasih kepada Antony dari komentar http://beerpla .net/2009/02/17/swapping-column-values-in-mysql/ untuk tweak "IS NOT NULL". Tanpa itu, kueri bekerja secara tidak terduga. Lihat skema tabel di akhir posting. Metode ini tidak menukar nilai jika salah satunya adalah NULL. Gunakan metode #3 yang tidak memiliki batasan ini.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
Metode ini ditawarkan oleh Dipin, sekali lagi, di komentar http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Saya pikir itu solusi yang paling elegan dan bersih. Ia bekerja dengan nilai NULL dan non-NULL.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
Pendekatan lain yang saya lakukan tampaknya berhasil:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
Pada dasarnya, tabel pertama adalah tabel yang diperbarui dan tabel kedua digunakan untuk menarik data lama.
Perhatikan bahwa pendekatan ini memerlukan kunci utama.
Ini adalah skema pengujian saya:
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);