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

Cách phát hiện sự kiện ON UPDATE đã kích hoạt trong MySQL bằng ROW_COUNT()

Khi dùng INSERT ... ON DUPLICATE KEY UPDATE, MySQL không trả về trực tiếp thông tin "đã INSERT mới hay UPDATE hiện có". Hàm ROW_COUNT() (hoặc LAST_INSERT_ID() trong một số trường hợp) giúp phân biệt:

  • ROW_COUNT() = 1 → **INSERT mới** (1 hàng bị ảnh hưởng).
  • ROW_COUNT() = 2 → **UPDATE hiện có** (1 hàng tìm thấy + 1 hàng cập nhật = 2 affected rows).

Ví dụ minh họa

Tạo bảng có UNIQUE KEY trên Value:

mysql> CREATE TABLE DemoTable1512 (
    -> Value INT,
    -> UNIQUE(Value)
    -> );

Lần 1: INSERT giá trị 90 (chưa có) → INSERT mới:

mysql> INSERT INTO DemoTable1512 VALUES (90) ON DUPLICATE KEY UPDATE Value = Value + 10;
Query OK, 1 row affected (0.09 sec)

mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           1 |  -- = 1 → INSERT mới
+-------------+

Lần 2: INSERT lại giá trị 90 (đã có) → UPDATE:

mysql> INSERT INTO DemoTable1512 VALUES (90) ON DUPLICATE KEY UPDATE Value = Value + 10;
Query OK, 2 rows affected (0.12 sec)  -- ⚠️ Thông báo "2 rows affected"

mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
|           2 |  -- = 2 → UPDATE (ON DUPLICATE KEY đã chạy)
+-------------+

Giải thích

  • MySQL báo 2 rows affected cho UPDATE trong ON DUPLICATE KEY (1 row matched + 1 row changed).
  • ROW_COUNT() trả về chính con số này.
  • Kiểm tra ngay sau câu INSERT/UPDATE (trước câu lệnh khác) vì ROW_COUNT() reset sau mỗi câu.

Ứng dụng thực tế

  • Logging: ghi log "INSERTED" hoặc "UPDATED" tùy ROW_COUNT().
  • Ứng dụng: trả về status cho client (created vs updated).
  • Trigger: trong trigger AFTER INSERT, dùng ROW_COUNT() để biết nguyên nhân.

Lưu ý

  • Chỉ hoạt động với ON DUPLICATE KEY UPDATE. Với REPLACE INTO, ROW_COUNT() cũng trả 2 khi replace (delete + insert).
  • Không dùng LAST_INSERT_ID() cho trường hợp này – nó chỉ trả AUTO_INCREMENT của hàng mới insert, không phân biệt update.