SQL: If EXISTS Then UPDATE Else INSERT

posted on 21 Mar 2008 10:12 by icedtea in Programming

ในหลายกรณีที่คุณอาจจะต้องเขียน Stored Procedure เพื่อทำหน้าที่ง่ายๆ อย่างตรวจสอบว่ามี record นี้หรือยัง หากมีแล้วให้ทำการ UPDATE หากยังไม่มีให้ทำการ INSERT อย่างกรณีที่ใช้กันไม่ว่าจะสำหรับอัปเดต/เพิ่มสินค้า หรือสถิติก็ตาม

โดยปกติแล้ว ผมเองก็จะเขียนใช้ IF statement อะไรแบบนี้

IF EXISTS (SELECT * FROM Table1 WHERE Column1='something')

    UPDATE Table1 SET (something = something) WHERE Column1='something'

ELSE

    INSERT INTO Table1 VALUES (something, something)

 

วันก่อนเพื่อนที่ทำงานอยู่มาถาม ผมเองก็ให้ความแนะนำแบบนี้ไป หากค้นหาบนอินเทอร์เน็ตตามบอร์ดต่างๆ ก็จะเห็นว่าแนะนำวิธีแบบนี้กัน แต่วันหนึ่งได้ไปอ่านเจอบล็อกนี้พอดี ซึ่งอธิบายถึงแนวทางที่ดีกว่านี้ เลยขอมาเล่าให้ฟังเพราะว่าหลายคนอาจไม่รู้เหมือนกัน

ซึ่งเข้าใจก่อนว่าวิธีเดิมนั้น SQL ต้องเสียเวลาไปค้นหาเพื่อตรวจสอบว่ามี record อยู่หรือเปล่า แต่ถ้าใช้วิธีใหม่แบบนี้:

UPDATE Table1 SET (something = something) WHERE Column1='something'

IF @@ROWCOUNT=0

    INSERT INTO Table1 VALUES (something, something)

 

จะพบว่า SQL ไม่ต้องเสียเวลาค้นหาเลย โดยจะพยายามอัปเดตทันที จากนั้นตรวจสอบว่าอัปเดตได้หรือไม่ด้วยเพียงตรวจค่า ROWCOUNT ไม่ต้องค้นหา จากนั้นหากไม่ได้อัปเดต จึงค่อย INSERT พอผมอ่านจบ บอกว่าค่อนข้างประทับใจเลย เวลารู้สึกได้รู้วิธีอะไรใหม่ๆ ดีกว่าเดิม

ป.ล. ผมเคยมีประสบการณ์จริงที่เคยเขียนแล้วใช้งานจริง โดยเขียนใช้วิธีแรก แต่แล้วคำสั่งอัปเดตผิดพลาดอย่างเป็น .... WHERE DepartmentCode = DepartmentCode แทนที่จะเป็น DepartmentCode = @DepartmentCode เพียงโค้ดผิดเล็กน้อย ทำให้คำสั่งไปอัปเดตซ้ำกัน โดยหลายกรณีควร INSERT ใหม่ พอเห็นแล้วรู้สึกได้โง่เลย จากนั้นต้องมานั่งแก้ไม่ใช่แค่โค้ด แต่รันคำนวณประมวลข้อมูลใหม่อีกด้วย เหอะๆ

Tags: sql 4 Comments

Comment

Comment:

Tweet

พอดีไปเห็นว่าหมดเวลาบล็อคอีก 2 ชม.

ยังไงก็ขอบคุณนะคะ
คราวหลังจะไม่รีเฟรชบ่อยๆตอนเน็ตห่วยอีกแล้ว

#4 By loveable (222.123.213.22) on 2010-01-03 14:55

ช่วยด้วยค่ะ พอดีแก้ไขบทความในวิกิแล้วคอม error ส่งไปหลายครั้ง ตอนนี้ถูกชื่อของคุณบล็อคอยู่ค่ะ จะทำยังไงดีคะ ?

#3 By loveable (222.123.213.22) on 2010-01-03 14:35

อ่านหลายรอบมากทำให้เหมือนเข้าใจ แต่ไม่รู้ว่าทำยังไง sad smile เขียนเรื่องเฉพาะอีกแล้ว

#2 By ตุ้มเป๊ะ on 2008-03-21 22:16

อ่านแล้ว งง

สงสัยต้อง

DROP TABLE *
DROP DATABASE *

sad smile

#1 By manop on 2008-03-21 10:41