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 affectedcho 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ớiREPLACE 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.