Để hoán đổi dữ liệu giữa hai cột trong MySQL, sử dụng kỹ thuật biến tạm.
Tạo bảng demo
mysql> create table DemoTable (
-> Name1 varchar(100),
-> Name2 varchar(100)
-> );
Query OK, 0 rows affected (0.58 sec)
Chèn dữ liệu
mysql> insert into DemoTable values('John Smith', 'Chris Brown');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('David Miller', 'Jone Doe');
Query OK, 1 row affected (0.16 sec)
Hiển thị dữ liệu gốc
mysql> select * from DemoTable;
Kết quả
+--------------+-------------+ | Name1 | Name2 | +--------------+-------------+ | John Smith | Chris Brown | | David Miller | Jone Doe | +--------------+-------------+ 2 rows in set (0.00 sec)
Truy vấn hoán đổi Name1 và Name2
mysql> update DemoTable
-> SET Name1 = (@tmpName := Name1), Name1 = Name2, Name2 = @tmpName;
Query OK, 2 rows affected (0.13 sec)
Rows matched: 2 Changed: 2 Warnings: 0
Kiểm tra kết quả - Đã hoán đổi thành công
mysql> select * from DemoTable;
Kết quả
+-------------+--------------+ | Name1 | Name2 | +-------------+--------------+ | Chris Brown | John Smith | | Jone Doe | David Miller | +-------------+--------------+ 2 rows in set (0.00 sec)
Giải thích kỹ thuật:
@tmpName := Name1: Gán giá trị Name1 vào biến session @tmpName.Name1 = Name2: Gán Name2 vào Name1.Name2 = @tmpName: Gán giá trị cũ của Name1 (đã lưu trong @tmpName) vào Name2.- MySQL đánh giá các biểu thức theo thứ tự từ trái sang phải trong cùng một SET.
Cách khác (an toàn hơn, chuẩn SQL):
UPDATE DemoTable SET Name1 = Name2, Name2 = Name1 WHERE 1=1; -- SAI: cả hai cùng tham chiếu giá trị mới
Cần dùng subquery hoặc biến tạm như trên.