Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ตรวจสอบว่า ON DUPLICATE KEY UPDATE ทำงานหรือไม่ใน MySQL ด้วย ROW_COUNT()

ROW_COUNT(): ตรวจสอบจำนวนแถวที่ได้รับผลกระทบจากคำสั่งล่าสุด

หลังรัน INSERT ... ON DUPLICATE KEY UPDATE ใช้ ROW_COUNT() เพื่อทราบว่าเป็น Insert ใหม่ (1) หรือ Update existing (2)

ค่าที่ ROW_COUNT() คืน

สร้างตารางมี 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)
สถานการณ์ROW_COUNT()ความหมาย
INSERT ใหม่ (ไม่มี Duplicate Key)1Insert 1 row
Duplicate Key → UPDATE ทำงาน21 (Insert พยายาม) + 1 (Update จริง)
Duplicate Key → UPDATE แต่ค่าไม่เปลี่ยน0ไม่มีแถวเปลี่ยนแปลง