INSERT / UPDATE / DELETE + Transaction
เพิ่ม แก้ ลบ ข้อมูล ความสำคัญของ WHERE ที่ลืมไม่ได้เด็ดขาด BEGIN/COMMIT/ROLLBACK ป้องกันความผิดพลาด race condition
จนถึงบทนี้เราดึงข้อมูลออกมาดูอย่างเดียว ตอนนี้ถึงเวลาเปลี่ยนข้อมูลจริงแล้ว 3 คำสั่งหลักที่ทุก app ใช้ตลอดเวลาคือ INSERT สำหรับเพิ่ม UPDATE สำหรับแก้ และ DELETE สำหรับลบ และทั้งสามอันนี้ก็เป็นจุดที่ผิดพลาดได้ง่ายที่สุดด้วย
INSERT สำหรับเพิ่ม row ใหม่
INSERT INTO users (name, email, city)
VALUES ('น้ำส้ม', '[email protected]', 'กรุงเทพ');ระบุ column ที่จะใส่ค่าก่อน แล้วใส่ลำดับค่าให้ตรงกับ column ที่ระบุไว้ column ที่ไม่ได้ระบุ database จะเติม default ให้ เช่น id ที่ auto-increment ส่วน column ที่ไม่มี default และไม่ใช่ NOT NULL ก็จะได้ค่า NULL
UPDATE สำหรับแก้ค่า column
UPDATE orders
SET status = 'shipped'
WHERE id = 5;SET บอกว่า column ไหนจะถูกเปลี่ยนเป็นค่าอะไร ถ้าอยากอัปเดตหลาย column พร้อมกันก็คั่นด้วย comma เช่น SET status = 'paid', total = 1000
DELETE สำหรับลบ row
DELETE FROM orders
WHERE status = 'cancelled';ลองเปลี่ยนข้อมูลใน playground (ปลอดภัย)
ลองเปลี่ยน WHERE เป็น "ไม่ใส่ WHERE" ดูว่า row ที่ได้รับผลกระทบ จะเป็นเท่าไหร่ ปุ่ม Execute จะเปลี่ยนเป็นสีแดงเตือนทันที
DELETE FROM orders WHERE id = 5;
| id | user_id | total | status | |
|---|---|---|---|---|
| 1 | 1 | ฿121 | shipped | |
| 5 | 2 | ฿450 | shipped | เลือกอยู่ |
| 7 | 2 | ฿83 | shipped | |
| 8 | 3 | ฿2,729 | shipped | |
| 11 | 3 | ฿539 | paid | |
| 12 | 3 | ฿1,170 | pending | |
| 15 | 5 | ฿199 | shipped | |
| 18 | 6 | ฿178 | shipped |
Transaction คือปุ่ม undo ของ database
เคยพิมพ์ผิดแล้วอยากย้อนกลับไหม database มีให้ใช้ เรียกว่า transaction ขั้นตอนการใช้คือ
BEGIN TRANSACTIONเพื่อเปิด transaction- รันคำสั่ง INSERT, UPDATE, หรือ DELETE ได้เท่าที่ต้องการ การเปลี่ยนแปลงทั้งหมดจะ "ค้างไว้" ก่อน ยังไม่ถาวร
COMMITเพื่อยืนยันให้เปลี่ยนเป็นถาวร หรือROLLBACKเพื่อยกเลิก กลับไปเหมือนไม่เคยทำอะไรลงไป
ลองกลับขึ้นไปที่ MutationPlayground ด้านบน กด BEGIN ก่อน แล้วค่อย Execute จะเห็น row ที่มี marker "pending" ขึ้นมา จากนั้นกด ROLLBACK ดูว่ากลับมาเหมือนเดิมยังไง
ทำไม Transaction ถึงสำคัญ (Race Condition)
สมมติ Vibe Mart มีของเหลือชิ้นสุดท้าย แล้วลูกค้า 2 คนกดซื้อพร้อมกันพอดี ถ้าไม่มี transaction จะเกิดอะไรขึ้น
- SELECT stock FROM products WHERE id = 15เห็น stock=1
- UPDATE stock = 0
- INSERT order #100 (1 ชิ้น)
- SELECT stock FROM products WHERE id = 15เห็น stock=1
- UPDATE stock = 0
- INSERT order #101 (1 ชิ้น)
สรุปบทนี้
INSERT INTO,UPDATE SET WHERE, และDELETE FROM WHEREคือ 3 คำสั่งหลักสำหรับ เปลี่ยนข้อมูล- ลืม
WHEREเมื่อไหร่ คือพังทุก row ห้ามทำใน production เด็ดขาด - Transaction (
BEGIN,COMMIT,ROLLBACK) ทำหน้าที่ทั้งปุ่ม undo และป้องกัน race condition - หลักการที่ปลอดภัยคือ SELECT ก่อนเสมอ แล้วเริ่ม BEGIN จากนั้นค่อย mutate และ COMMIT (หรือ ROLLBACK ถ้าผลผิด)
- บทถัดไปคือ AI Survival ที่จะสอนตรวจ query ที่ AI สร้างให้ก่อนรัน