วิธีการดึง id ของค่าที่ถูกแทรกใหม่ใน SQL อย่างปลอดภัย

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

ความท้าทาย: การเข้าถึงตัวระบุบันทึกใหม่

ลองจินตนาการว่าคุณมีตารางในฐานข้อมูล SQL ของคุณที่มีหนึ่งในคอลัมน์ตั้งค่าให้สร้างตัวระบุตามอัตโนมัติ (id) เมื่อมีการแทรก หลังจากการเพิ่มบันทึกในตารางนี้ คุณอาจต้องการดำเนินการเพิ่มเติมที่ต้องการตัวระบุที่เป็นเอกลักษณ์ที่คุณเพิ่งสร้างขึ้น วิธีแก้ปัญหาคือคุณต้องเลือกวิธีที่ถูกต้องในการดึงตัวระบุมาน

วิธีทั่วไป: @@IDENTITY ที่ชวนให้เข้าใจผิด

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

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

วิธีที่แนะนำ: การใช้ SCOPE_IDENTITY()

เพื่อดึงตัวระบุของบันทึกที่คุณเพิ่งแทรกอย่างปลอดภัยควรใช้ SCOPE_IDENTITY() นี่คือเหตุผลที่แนะนำ:

  • ปลอดภัยในขอบเขต: แตกต่างจาก @@IDENTITY SCOPE_IDENTITY() คืนค่าตัวระบุตัวสุดท้ายที่ถูกสร้างขึ้นสำหรับตารางเฉพาะภายในขอบเขตเดียวกัน นั่นหมายความว่าถึงแม้ว่าจะมี trigger อยู่ มันจะไม่ส่งคืนตัวระบุจากตารางเหล่านั้น
  • แน่นอนและเชื่อถือได้: มันรับประกันว่าค่าที่คุณดึงมาคือค่าที่ถูกต้องที่เกี่ยวข้องกับการดำเนินการ INSERT ล่าสุดของคุณ

วิธีการใช้ SCOPE_IDENTITY()

นี่คือคำอธิบายสั้น ๆ ว่าจะใช้ SCOPE_IDENTITY() อย่างมีประสิทธิภาพได้อย่างไร:

  1. ทำการแทรก: แทรกบันทึกของคุณเข้าสู่ตารางก่อน

    INSERT INTO YourTable (Column1, Column2) VALUES (Value1, Value2);
    
  2. ดึง ID ใหม่: ทันทีหลังจากคำสั่งแทรก ให้เรียกใช้ SCOPE_IDENTITY() เพื่อรับตัวระบุใหม่

    DECLARE @NewID INT;
    SET @NewID = SCOPE_IDENTITY();
    
  3. ใช้ ID ใหม่: ตอนนี้คุณสามารถใช้ @NewID สำหรับการดำเนินการเพิ่มเติมที่คุณต้องการทำกับบันทึกที่ถูกแทรกใหม่

สรุป

การดึง id ของค่าที่ถูกแทรกใหม่ใน SQL สามารถทำได้ง่ายหากคุณใช้วิธีที่ถูกต้อง โดยการเลือกใช้ SCOPE_IDENTITY() คุณมั่นใจได้ว่าตัวระบุที่คุณใช้งานนั้นปลอดภัยและเกี่ยวข้องกับการทำธุรกรรมปัจจุบันของคุณ หลีกเลี่ยงปัญหาที่อาจเกิดขึ้นจากวิธีที่ไม่น่าเชื่อถือเช่น @@IDENTITY เสมอให้คำนึงถึงสิ่งนี้เพื่อรักษาความถูกต้องของข้อมูลและทำให้การใช้งานฐานข้อมูลของคุณราบรื่น โค้ดให้สนุก!