Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

UPDATE MySQL không ghi đè nếu giá trị mới giống giá trị cũ

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 WHERE
  • Changed: 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 UPDATE triggers
  • 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);