Để thay đổi giá trị của một cột cho một hàng cụ thể (ví dụ: sửa tên), dùng câu lệnh UPDATE với điều kiện WHERE chính xác.
Ví dụ: Đổi FirstName của ID=103 từ 'David' thành 'Carol'
Tạo bảng:
mysql> CREATE TABLE DemoTable1504 (
-> Id INT,
-> FirstName VARCHAR(20)
-> );
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1504 VALUES
-> (101, 'Chris'), (102, 'Bob'), (103, 'David'), (104, 'Mike');
Cập nhật có điều kiện an toàn (chỉ đổi nếu khác giá trị mới):
mysql> UPDATE DemoTable1504
-> SET FirstName = 'Carol'
-> WHERE Id = 103 AND FirstName <> 'Carol';
Kết quả:
+------+-----------+ | Id | FirstName | +------+-----------+ | 101 | Chris | | 102 | Bob | | 103 | Carol | | 104 | Mike | +------+-----------+
Các trường hợp "swap" phức tạp hơn
1. Hoán đổi giá trị giữa 2 hàng (swap 2 rows)
Cần biến tạm hoặc cập nhật 2 bước:
-- Giả sử swap FirstName của Id=101 và Id=102
UPDATE DemoTable1504 SET FirstName = CASE Id
WHEN 101 THEN (SELECT FirstName FROM DemoTable1504 WHERE Id=102)
WHEN 102 THEN (SELECT FirstName FROM DemoTable1504 WHERE Id=101)
END
WHERE Id IN (101, 102);
2. Hoán đổi 2 cột cùng hàng
UPDATE bang SET cot_a = cot_b, cot_b = cot_a WHERE dieu_kien; -- ❌ SAI: cot_b đã đổi trước
-- ✅ ĐÚNG: dùng biến người dùng
UPDATE bang
SET cot_a = @tmp := cot_a,
cot_a = cot_b,
cot_b = @tmp
WHERE dieu_kien;
Lưu ý an toàn
- Luôn có
WHEREchính xác (khóa chính hoặc unique key) để tránh cập nhật nhầm hàng khác. - Thêm điều kiện
AND cot <> gia_tri_moiđể tránh ghi đè vô nghĩa (giảm binlog, trigger). - Trong transaction nếu cần rollback khi sai.