Cơ chế UPDATE trong MySQL: Bỏ qua hàng không thay đổi giá trị
MySQL tối ưu hóa UPDATE: nếu giá trị mới (SET) giống hệt giá trị cũ, hàng đó không được ghi đè và không tính vào "rows affected".
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
StudentId INT,
StudentMathMarks INT,
StudentMySQLMarks INT
);
mysql> INSERT INTO DemoTable VALUES
(1, 56, 78), (2, 88, 99), (3, 34, 98);
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-----------+------------------+-------------------+ | StudentId | StudentMathMarks | StudentMySQLMarks | +-----------+------------------+-------------------+ | 1 | 56 | 78 | | 2 | 88 | 99 | | 3 | 34 | 98 | +-----------+------------------+-------------------+
3. Truy vấn UPDATE với giá trị y hệt cũ (StudentId=2)
mysql> UPDATE DemoTable
SET StudentId = 2, StudentMathMarks = 88, StudentMySQLMarks = 99
WHERE StudentId = 2;
4. Kết quả
Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
Giải thích:
Rows matched: 1: Tìm thấy 1 hàng khớp WHEREChanged: 0: Không hàng nào thực sự thay đổi giá trị0 rows affected: MySQL báo 0 hàng bị ảnh hưởng
Ý nghĩa thực tế:
- Tiết kiệm I/O disk, giảm write amplification
- Không trigger
ON UPDATEtriggers - Không cập nhật timestamp
ON UPDATE CURRENT_TIMESTAMP - Replication: Không ghi binlog cho hàng không đổi
Kiểm tra hàng sẽ thay đổi trước khi UPDATE:
SELECT * FROM DemoTable WHERE StudentId = 2 AND (StudentMathMarks <> 88 OR StudentMySQLMarks <> 99);