วิธีการดึง 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()
อย่างมีประสิทธิภาพได้อย่างไร:
-
ทำการแทรก: แทรกบันทึกของคุณเข้าสู่ตารางก่อน
INSERT INTO YourTable (Column1, Column2) VALUES (Value1, Value2);
-
ดึง ID ใหม่: ทันทีหลังจากคำสั่งแทรก ให้เรียกใช้
SCOPE_IDENTITY()
เพื่อรับตัวระบุใหม่DECLARE @NewID INT; SET @NewID = SCOPE_IDENTITY();
-
ใช้ ID ใหม่: ตอนนี้คุณสามารถใช้
@NewID
สำหรับการดำเนินการเพิ่มเติมที่คุณต้องการทำกับบันทึกที่ถูกแทรกใหม่
สรุป
การดึง id
ของค่าที่ถูกแทรกใหม่ใน SQL สามารถทำได้ง่ายหากคุณใช้วิธีที่ถูกต้อง โดยการเลือกใช้ SCOPE_IDENTITY()
คุณมั่นใจได้ว่าตัวระบุที่คุณใช้งานนั้นปลอดภัยและเกี่ยวข้องกับการทำธุรกรรมปัจจุบันของคุณ หลีกเลี่ยงปัญหาที่อาจเกิดขึ้นจากวิธีที่ไม่น่าเชื่อถือเช่น @@IDENTITY
เสมอให้คำนึงถึงสิ่งนี้เพื่อรักษาความถูกต้องของข้อมูลและทำให้การใช้งานฐานข้อมูลของคุณราบรื่น โค้ดให้สนุก!