Tôi vừa phải giải quyết vấn đề tương tự và tôi sẽ tóm tắt những phát hiện của mình.
-
Bảng
UPDATE table SET X=Y, Y=X
cách tiếp cận rõ ràng là không hoạt động, vì nó sẽ chỉ đặt cả hai giá trị thành Y. -
Đây là một phương pháp sử dụng một biến tạm thời. Cảm ơn Antony từ nhận xét của http:// beerpla .net / 2009/02/17 / swapping-column-values-in-mysql / cho chỉnh sửa "KHÔNG ĐỦ". Không có nó, truy vấn hoạt động không thể đoán trước được. Xem lược đồ bảng ở cuối bài. Phương thức này không hoán đổi các giá trị nếu một trong số chúng là NULL. Sử dụng phương pháp số 3 không có giới hạn này.
UPDATE swap_test SET x=y, [email protected] WHERE (@temp:=x) IS NOT NULL;
-
Phương pháp này được đưa ra bởi Dipin, nhưng một lần nữa, các nhận xét của http://beerpla.net/2009/02/17/swapping-column-values-in-mysql/ . Tôi nghĩ đó là giải pháp thanh lịch và sạch sẽ nhất. Nó hoạt động với cả giá trị NULL và không phải NULL.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;
-
Một cách tiếp cận khác mà tôi nghĩ ra có vẻ hiệu quả:
UPDATE swap_test s1, swap_test s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;
Về cơ bản, bảng thứ nhất là bảng được cập nhật và bảng thứ hai được sử dụng để lấy dữ liệu cũ từ đó.
Lưu ý rằng phương pháp này yêu cầu phải có khóa chính.
Đây là giản đồ thử nghiệm của tôi:
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);