ROW_COUNT(): ตรวจสอบจำนวนแถวที่ได้รับผลกระทบจากคำสั่งล่าสุด
หลังรัน INSERT ... ON DUPLICATE KEY UPDATE ใช้ ROW_COUNT() เพื่อทราบว่าเป็น Insert ใหม่ (1) หรือ Update existing (2)
ค่าที่ ROW_COUNT() คืน
| สถานการณ์ | ROW_COUNT() | ความหมาย |
| INSERT ใหม่ (ไม่มี Duplicate Key) | 1 | Insert 1 row |
| Duplicate Key → UPDATE ทำงาน | 2 | 1 (Insert พยายาม) + 1 (Update จริง) |
| Duplicate Key → UPDATE แต่ค่าไม่เปลี่ยน | 0 | ไม่มีแถวเปลี่ยนแปลง |
สร้างตารางมี Unique Key
mysql> CREATE TABLE DemoTable1512 (
-> Value INT,
-> UNIQUE(Value)
-> );
Query OK, 0 rows affected (0.60 sec)
ครั้งแรก: INSERT ใหม่ (Value=90)
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 ใหม่ (ON DUPLICATE KEY ไม่ทำงาน)
ครั้งที่สอง: INSERT ซ้ำ (Value=90) → UPDATE ทำงาน
mysql> INSERT INTO DemoTable1512 VALUES(90) ON DUPLICATE KEY UPDATE Value = Value + 10;
Query OK, 2 rows affected (0.12 sec)
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
| 2 |
+-------------+
→ คืน 2 = Duplicate Key พบ → UPDATE ทำงาน (Value กลายเป็น 100)
ตรวจสอบค่าสุดท้าย
mysql> SELECT * FROM DemoTable1512;
+-------+
| Value |
+-------+
| 100 |
+-------+
การใช้งานใน Application (Stored Procedure / Code)
-- Stored Procedure Example
DELIMITER //
CREATE PROCEDURE UpsertValue(IN p_value INT)
BEGIN
INSERT INTO DemoTable1512 VALUES(p_value)
ON DUPLICATE KEY UPDATE Value = Value + 10;
IF ROW_COUNT() = 1 THEN
SELECT 'INSERTED' AS action;
ELSEIF ROW_COUNT() = 2 THEN
SELECT 'UPDATED' AS action;
ELSE
SELECT 'NO_CHANGE' AS action;
END IF;
END//
DELIMITER ;
⚠️ ข้อจำกัด ROW_COUNT()
- คืนค่าของคำสั่ง ล่าสุดเท่านั้น (ไม่รวม SELECT)
- ใน Stored Program ให้เรียกทันทีหลังคำสั่งที่ต้องการตรวจสอบ
- ไม่ทำงานกับ SELECT (ใช้
FOUND_ROWS() แทน แต่ Deprecated ใน MySQL 8.0)