Saya percaya memiliki variabel pertukaran perantara adalah praktik terbaik dengan cara seperti itu:
update z set c1 = @c := c1, c1 = c2, c2 = @c
Pertama, selalu berhasil; kedua, ia bekerja terlepas dari tipe data.
Meskipun Keduanya
update z set c1 = c1 ^ c2, c2 = c1 ^ c2, c1 = c1 ^ c2
dan
update z set c1 = c1 + c2, c2 = c1 - c2, c1 = c1 - c2
bekerja biasanya, hanya untuk tipe data nomor by the way, dan itu adalah tanggung jawab Anda untuk mencegah overflow, Anda tidak dapat menggunakan XOR antara ditandatangani dan tidak ditandatangani, Anda juga tidak dapat menggunakan jumlah untuk kemungkinan melimpah.
Dan
update z set c1 = c2, c2 = @c where @c := c1
tidak berfungsi jika c1 adalah 0 atau NULL atau nol string panjang atau hanya spasi.
Kita perlu mengubahnya
update z set c1 = c2, c2 = @c where if((@c := c1), true, true)
Ini skripnya:
mysql> create table z (c1 int, c2 int)
-> ;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into z values(0, 1), (-1, 1), (pow(2, 31) - 1, pow(2, 31) - 2)
-> ;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| -1 | 1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.02 sec)
mysql> update z set c1 = c1 ^ c2, c2 = c1 ^ c2, c1 = c1 ^ c2;
ERROR 1264 (22003): Out of range value for column 'c1' at row 2
mysql> update z set c1 = c1 + c2, c2 = c1 - c2, c1 = c1 - c2;
ERROR 1264 (22003): Out of range value for column 'c1' at row 3
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| 1 | -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.02 sec)
mysql> update z set c1 = c2, c2 = @c where @c := c1;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| -1 | 1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.00 sec)
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 1 | 0 |
| 1 | -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)
mysql> update z set c1 = @c := c1, c1 = c2, c2 = @c;
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 0 | 1 |
| -1 | 1 |
| 2147483647 | 2147483646 |
+------------+------------+
3 rows in set (0.00 sec)
mysql>update z set c1 = c2, c2 = @c where if((@c := c1), true, true);
Query OK, 3 rows affected (0.02 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from z;
+------------+------------+
| c1 | c2 |
+------------+------------+
| 1 | 0 |
| 1 | -1 |
| 2147483646 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)
UPDATE table SET X = Y, Y = X
adalah cara standar untuk melakukannya dalam SQL, hanya perilaku MySQL.