ทำไมเราต้องใช้ RETURNING ในการจัดการข้อมูล
เวลาเราเขียนโปรแกรมจัดการฐานข้อมูล (ที่เก็บข้อมูลอย่างเป็นระเบียบ) เรามักจะสั่ง UPDATE (แก้ไขข้อมูลเดิม) หรือ DELETE (ลบข้อมูลทิ้ง) ไปตรงๆ ปกติแล้วคำสั่งพวกนี้จะบอกแค่ว่า "ทำสำเร็จแล้ว" แต่ไม่ได้บอกว่าข้อมูลที่เพิ่งเปลี่ยนไปหน้าตาเป็นยังไง
ลองนึกภาพคุณสั่งอาหารในแอปเดลิเวอรี แล้วแอปบอกแค่ว่า "สั่งสำเร็จ" โดยไม่บอกว่าเมนูที่คุณสั่งคืออะไร หรือราคาเท่าไหร่ มันคงทำให้เราไม่มั่นใจว่าสิ่งที่ทำไปนั้นถูกต้องไหม RETURNING คือฟีเจอร์เด็ดของ PostgreSQL ที่ช่วยให้เราเห็นข้อมูลที่ถูกจัดการไปแบบทันทีไม่ต้องไปสั่งหาข้อมูลซ้ำอีกรอบ
การใช้ RETURNING จะช่วยให้โปรแกรมเมอร์ลดขั้นตอนการทำงานลงได้เยอะมาก เพราะเราไม่ต้องเขียน Query (คำสั่งถามข้อมูลจากฐานข้อมูล) สองรอบเพื่อเช็กผลลัพธ์ มันช่วยประหยัดเวลาและทำให้โค้ดของเราสะอาดขึ้นอย่างเห็นได้ชัด ใครที่กำลังหัดเขียนแอปพลิเคชันควรฝึกใช้ฟีเจอร์นี้ให้คล่องตั้งแต่วันนี้เลย
พื้นฐานการแก้ไขข้อมูลด้วย UPDATE
คำสั่ง UPDATE ใช้สำหรับเปลี่ยนค่าในแถวข้อมูลที่เรามีอยู่แล้ว เช่น การเปลี่ยนชื่อผู้ใช้งาน หรือเปลี่ยนสถานะการสั่งซื้อสินค้า โดยเราต้องระบุให้ชัดเจนว่าต้องการแก้ข้อมูลไหนผ่านเงื่อนไข WHERE (คำสั่งระบุเจาะจงว่าเอาแถวไหน)
ถ้าเราลืมใส่เงื่อนไข WHERE ข้อมูลทั้งหมดในตารางจะถูกแก้ไขไปในทิศทางเดียวกันหมด ซึ่งเป็นเรื่องที่อันตรายมากสำหรับมือใหม่ที่หัดเขียนโค้ด ดังนั้นต้องตรวจสอบคำสั่งให้ดีก่อนกดรันเสมอ เพื่อป้องกันข้อมูลในระบบพังโดยไม่ตั้งใจ
มาลองดูตัวอย่างการเปลี่ยนชื่อผู้ใช้กัน สมมติว่าเรามีตารางชื่อ users และเราต้องการเปลี่ยนชื่อของคนที่มีไอดีเป็นหมายเลข 1 ให้กลายเป็นชื่อใหม่
-- แก้ไขชื่อผู้ใช้ที่มี id เป็น 1
UPDATE users
SET name = 'Somchai'
WHERE id = 1;
บรรทัดแรก UPDATE users คือการบอกว่าเราจะแก้ตารางไหน บรรทัดสอง SET name = 'Somchai' คือการกำหนดค่าใหม่ให้คอลัมน์ชื่อ บรรทัดสุดท้าย WHERE id = 1 คือการบอกว่าแก้แค่แถวที่มีไอดีเป็น 1 เท่านั้น
ผลลัพธ์ที่ควรเห็นคือข้อความแจ้งเตือนว่า "UPDATE 1" ซึ่งหมายความว่ามีข้อมูลถูกแก้ไขไป 1 แถว แต่เราจะไม่รู้เลยว่าชื่อเดิมคืออะไรหรือชื่อใหม่หน้าตาเป็นอย่างไรจนกว่าจะสั่ง SELECT (คำสั่งดึงข้อมูล) อีกรอบ
ใช้ RETURNING เพื่อดูข้อมูลหลัง UPDATE
เมื่อเราเพิ่มคำสั่ง RETURNING เข้าไปใน UPDATE เราจะสามารถดึงข้อมูลที่เพิ่งเปลี่ยนเสร็จออกมาแสดงผลได้ทันที วิธีนี้ช่วยให้เราทำงานกับข้อมูลได้ลื่นไหลขึ้นโดยไม่ต้องเสียเวลาไปค้นหาข้อมูลนั้นอีกรอบให้เปลืองทรัพยากรเครื่อง
ลองจินตนาการว่าคุณต้องอัปเดตคะแนนสอบของนักเรียน แล้วต้องแสดงผลคะแนนใหม่ให้เจ้าของคะแนนเห็นทันที RETURNING จะตอบโจทย์นี้ได้สมบูรณ์แบบมาก เพราะมันส่งข้อมูลที่อัปเดตแล้วกลับมาให้เราในคำสั่งเดียวเลย
ลองดูตัวอย่างการใช้คำสั่งนี้ร่วมกันดูครับ เราจะเปลี่ยนคะแนนและดึงค่าที่เปลี่ยนออกมาแสดงทันที
-- อัปเดตคะแนนและดูผลลัพธ์ทันที
UPDATE students
SET score = 95
WHERE id = 10
RETURNING id, name, score;
บรรทัด RETURNING id, name, score คือส่วนสำคัญที่สั่งให้ระบบส่งค่าของคอลัมน์เหล่านั้นกลับมาให้เราดูหลังจากอัปเดตเสร็จแล้ว ทำให้เราได้ข้อมูลที่อัปเดตล่าสุดมาใช้งานในโปรแกรมได้ทันที
ผลลัพธ์ที่ควรเห็นคือตารางเล็กๆ ที่แสดงไอดี ชื่อ และคะแนนใหม่ของนักเรียนคนนั้นออกมาบนหน้าจอทันที แทนที่จะเห็นแค่เลข 1 แถวเหมือนแบบเดิม
การลบข้อมูลด้วย DELETE ร่วมกับ RETURNING
คำสั่ง DELETE ใช้สำหรับลบข้อมูลที่ไม่ต้องการออกจากระบบถาวร เช่น การลบโพสต์ที่ผู้ใช้กดลบไปแล้ว หรือการลบรายการสินค้าที่ถูกยกเลิก ซึ่งการมี RETURNING ในคำสั่งลบก็มีประโยชน์ไม่แพ้การอัปเดตเลย
บางครั้งเราลบข้อมูลทิ้งไปแล้ว แต่อยากรู้ว่าข้อมูลที่เพิ่งลบไปนั้นมีรายละเอียดอะไรบ้างเพื่อเอาไปทำบันทึก (Log) หรือแจ้งเตือนผู้ใช้งานว่า "คุณได้ลบรายการชื่ออะไรออกไปแล้ว" การใช้ RETURNING จะช่วยให้เราเก็บข้อมูลนั้นไว้ได้ก่อนที่มันจะหายไปจริงๆ
มาดูตัวอย่างการลบข้อมูลที่ใช้งานจริงกันครับ
-- ลบข้อมูลและดูว่ารายการที่ลบไปคืออะไร
DELETE FROM orders
WHERE id = 50
RETURNING id, product_name, amount;
คำสั่ง DELETE FROM orders คือการระบุตารางที่จะลบ WHERE id = 50 คือเงื่อนไขระบุแถว ส่วน RETURNING จะดึงข้อมูลแถวที่เพิ่งถูกลบไปออกมาแสดงให้เราเห็นว่าเราเพิ่งลบรายการอะไรไป
ผลลัพธ์ที่ควรเห็นคือข้อมูลของรายการสินค้าที่มีไอดี 50 ปรากฏขึ้นมาบนหน้าจอ ก่อนที่ข้อมูลนั้นจะถูกลบออกจากฐานข้อมูลถาวร ช่วยให้เราตรวจสอบได้ว่าลบถูกตัวแน่นอน
จุดที่มือใหม่มักพลาดและวิธีแก้ไข
ข้อผิดพลาดที่พบบ่อยที่สุดคือการลืมใส่ WHERE ในคำสั่ง UPDATE หรือ DELETE ซึ่งถ้าใช้ร่วมกับ RETURNING มันจะส่งข้อมูลออกมาทุกแถวในตาราง ซึ่งอาจจะเยอะจนหน้าจอค้างหรือข้อมูลสำคัญหายเกลี้ยงได้เลย
อีกเรื่องคือการเลือกคอลัมน์ใน RETURNING ถ้าเราดึงข้อมูลที่ไม่มีอยู่จริง หรือสะกดชื่อคอลัมน์ผิด ระบบจะแจ้งเตือนข้อผิดพลาดทันที ซึ่งเป็นเรื่องดีเพราะช่วยป้องกันไม่ให้เราเผลอเขียนโค้ดที่ทำงานผิดพลาดไปในโปรดักชัน (เซิร์ฟเวอร์ที่ใช้งานจริง)
วิธีแก้ปัญหาคือให้หัดใช้ SELECT เพื่อทดสอบเงื่อนไข WHERE ก่อนเสมอ เช่น ลองรัน SELECT * FROM table WHERE ... เพื่อดูว่าข้อมูลที่เราต้องการจะลบหรือจะแก้คือตัวไหนจริงๆ ก่อนจะเปลี่ยนเป็นคำสั่ง UPDATE หรือ DELETE
สรุป: การนำไปใช้จริงในงานโปรแกรมเมอร์
การใช้ RETURNING เหมาะมากสำหรับงานที่ต้องการความเร็วและการตอบสนองต่อผู้ใช้งานที่รวดเร็ว เช่น การสร้างระบบแชทที่ต้องการยืนยันว่าข้อความถูกบันทึกแล้ว หรือระบบตะกร้าสินค้าที่ต้องแสดงผลลัพธ์ล่าสุดให้ผู้ใช้เห็นทันทีหลังจากกดเปลี่ยนจำนวนสินค้า
สมมติว่าคุณกำลังทำโปรเจกต์เว็บขายของ แล้วผู้ใช้กดลบสินค้าในตะกร้า แทนที่คุณจะเขียนโค้ดไปถามฐานข้อมูลอีกรอบเพื่อหาว่าสินค้าไหนหายไป คุณก็แค่ใช้ DELETE ... RETURNING แล้วส่งชื่อสินค้านั้นกลับไปแสดงผลที่หน้าเว็บได้เลย วิธีนี้ช่วยให้แอปของคุณดูฉลาดและทำงานได้รวดเร็วขึ้น
การฝึกใช้ฟีเจอร์เฉพาะของฐานข้อมูลจะทำให้คุณเหนือกว่าโปรแกรมเมอร์ทั่วไป เพราะคุณจะรู้วิธีเขียนโค้ดที่สั้นลงแต่มีประสิทธิภาพมากขึ้น เริ่มฝึกใช้ RETURNING ในโปรเจกต์จำลองวันนี้ แล้วคุณจะพบว่าการจัดการฐานข้อมูลไม่ใช่เรื่องยากอย่างที่คิดครับ