การเข้าใจวิธีการดึงค่า IDENTITY ของแถวที่ถูกแทรกใน SQL

ถ้าคุณกำลังทำงานกับ SQL Server และต้องการดึงค่า IDENTITY ของแถวที่ถูกแทรก คุณมีหลายวิธีให้เลือก โดยแต่ละวิธีมีผลลัพธ์และกรณีการใช้งานที่แตกต่างกัน ในโพสต์นี้เราจะสำรวจวิธีการที่พบบ่อยที่สุดในการดึงค่า IDENTITY ของแถวที่ถูกแทรกและชี้แจงว่าเมื่อไหร่ควรใช้แต่ละวิธี

ความท้าทายในการดึงค่า IDENTITY

เมื่อคุณแทรกข้อมูลใหม่ลงในตารางฐานข้อมูลที่มีคอลัมน์ identity SQL Server จะสร้างค่าที่ไม่ซ้ำกันสำหรับคอลัมน์นั้นโดยอัตโนมัติ อย่างไรก็ตาม คุณอาจพบว่าจำเป็นต้องดึงค่าที่สร้างขึ้นนี้ทันทีหลังจากทำการแทรก นี่อาจเป็นเรื่องสำคัญสำหรับหลายเหตุผล เช่น การบันทึก, การประมวลผลต่อไป, หรือการสร้างความสัมพันธ์กับตารางอื่น ๆ

วิธีการที่สามารถใช้ในการดึงค่าของ IDENTITY

  1. การใช้ @@IDENTITY

    • คำอธิบาย: คืนค่าหมายเลข identity ล่าสุดที่ถูกสร้างขึ้นสำหรับตารางใด ๆ ในเซสชั่นปัจจุบันทั่วทุกสโคป
    • คำเตือน: เนื่องจากมันดึงค่าจากทุกสโคป รวมถึงค่าที่ถูกสร้างโดย trigger จึงง่ายที่จะดึงค่าไม่คาดคิดได้
    • กรณีการใช้งาน: โดยทั่วไปไม่แนะนำเนื่องจากอาจเกิดความสับสนได้

    เรียนรู้เพิ่มเติมเกี่ยวกับ @@IDENTITY

  2. การใช้ SCOPE_IDENTITY()

    • คำอธิบาย: คืนค่าหมายเลข identity ล่าสุดที่ถูกสร้างขึ้นสำหรับตารางใด ๆ ในเซสชั่นปัจจุบันและในสโคปปัจจุบัน
    • คำแนะนำ: นี่เป็นวิธีที่ปลอดภัยและเชื่อถือได้มากที่สุดเมื่อดึงค่าหมายเลข identity
    • กรณีการใช้งาน: เหมาะสำหรับการดำเนินการตามปกติส่วนใหญ่

    เรียนรู้เพิ่มเติมเกี่ยวกับ SCOPE_IDENTITY()

  3. การใช้ IDENT_CURRENT('tableName')

    • คำอธิบาย: คืนค่าหมายเลข identity ล่าสุดที่ถูกสร้างขึ้นสำหรับตารางเฉพาะ แม้ว่าจะอยู่ในเซสชั่นหรือสโคปใด
    • หมายเหตุ: ใช้วิธีนี้เมื่อเป็นสิ่งสำคัญที่จะระบุตาราง แม้ว่านี่เป็นข้อกำหนดที่เกิดขึ้นไม่บ่อยนัก
    • กรณีการใช้งาน: อาจมีประโยชน์หากคุณต้องการดึงค่าจากตารางที่ไม่ถูกแก้ไขโดยเซสชั่นของคุณเมื่อเร็ว ๆ นี้

    เรียนรู้เพิ่มเติมเกี่ยวกับ IDENT_CURRENT()

  4. การใช้ OUTPUT Clause

    • คำอธิบาย: ช่วยให้คุณเข้าถึงแถวแต่ละแถวที่ถูกแทรกผ่านคำสั่ง INSERT ที่เฉพาะเจาะจง รวมถึงค่าหมายเลข identity ที่ถูกสร้างขึ้น
    • ข้อดี: ตรงไปตรงมามากกว่าวิธีข้างต้น รับประกันความถูกต้องแม้จะเกิดข้อผิดพลาดหลังจากการแทรก
    • ข้อเสีย: ค่อนข้างเยอะกว่าเนื่องจากคุณจะต้องแทรกผลลัพธ์ลงในตัวแปรตารางหรือตารางชั่วคราว
    • หมายเหตุพิเศษ: หากคำสั่งของคุณเกี่ยวข้องกับแผนการประมวลผลแบบขนาน นี่คือวิธีเดียวที่รับประกันว่าจะสามารถดึงค่าหมายเลข identity ได้

    เรียนรู้เพิ่มเติมเกี่ยวกับ OUTPUT clause

สรุป

แต่ละวิธีในการดึงค่า IDENTITY มีจุดแข็งและจุดอ่อนของตัวเอง นี่คือสรุปอย่างรวบรัดที่จะช่วยให้คุณตัดสินใจ:

  • ใช้ @@IDENTITY หากคุณไม่รังเกียจต่อการไม่ชัดเจนและความสับสน
  • ชอบใช้ SCOPE_IDENTITY() ในกรณีปกติส่วนใหญ่เพื่อรับประกันความถูกต้อง
  • เลือกใช้ IDENT_CURRENT() เมื่อคุณต้องการข้อมูลจากตารางเฉพาะ
  • ใช้ OUTPUT clause หากคุณต้องการค่าหลายค่าในการแทรกของคุณ โดยเฉพาะในคำสั่งที่ซับซ้อนหรือระหว่างการจัดการข้อผิดพลาด

ความคิดท้าย

โดยการเข้าใจวิธีเหล่านี้ คุณสามารถจัดการและดึงค่าหมายเลข identity ใน SQL Server ได้อย่างมีประสิทธิภาพ ทำให้การดำเนินการของฐานข้อมูลของคุณมีความสมบูรณ์และเชื่อถือได้มากขึ้น