DELETE ด้วย USING และรูปแบบที่ปลอดภัย
ลบแถวที่เชื่อมกับตารางอื่นด้วย DELETE ... USING และใช้ธุรกรรมร่วมกับ SELECT ก่อนเพื่อตรวจสอบก่อนดำเนินการที่ทำลายข้อมูล
DELETE ด้วย USING และรูปแบบที่ปลอดภัย เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
DELETE พื้นฐาน
ลบแถวที่ตรงตามเงื่อนไข:
DELETE FROM users WHERE id = 1;ทดสอบด้วย SELECT ก่อนเสมอ
ก่อนใช้ DELETE ใด ๆ ให้ใช้ WHERE เดียวกันกับ SELECT เพื่อยืนยันจำนวนแถว:
SELECT COUNT(*) FROM orders
WHERE status = 'cancelled' AND created_at < NOW() - INTERVAL '1 year';DELETE ในธุรกรรม
ครอบการดำเนินการที่ทำลายข้อมูลไว้ในธุรกรรม เพื่อให้คุณใช้ ROLLBACK ได้:
BEGIN;
DELETE FROM orders WHERE status = 'cancelled' AND ...;
SELECT COUNT(*) FROM orders; -- sanity check
-- COMMIT; or ROLLBACK;DELETE โดยไม่มี WHERE คือหายนะ
DELETE FROM users; จะล้างข้อมูลทั้งตาราง ไม่มีปุ่มเลิกทำ โปรดระมัดระวัง การใช้เวลาเพิ่มอีกหนึ่งวินาทีเพื่อพิมพ์ WHERE ถือเป็นการป้องกันที่คุ้มค่า
DELETE … USING (การลบแบบ JOIN ของ PostgreSQL)
ลบแถวในตารางหนึ่งโดยอ้างอิงจากอีกตารางหนึ่ง:
DELETE FROM orders o
USING users u
WHERE u.id = o.user_id
AND u.is_banned = true;DELETE พร้อมคำสั่งสอบถามย่อย
ทางเลือกตามมาตรฐาน:
DELETE FROM orders
WHERE user_id IN (SELECT id FROM users WHERE is_banned);การส่งต่อของคีย์ต่างประเทศ
หาก orders.user_id มี ON DELETE CASCADE การลบผู้ใช้จะลบคำสั่งซื้อของผู้ใช้คนนั้นโดยอัตโนมัติ สะดวกแต่มีความเสี่ยง ควรใช้อย่างจำกัด
ALTER TABLE orders
ADD CONSTRAINT orders_user_fk
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE;การลบแบบซอฟต์
แอปจำนวนมากไม่ได้ลบแถวจริง ๆ แต่กำหนดเวลาไว้ในคอลัมน์ deleted_at:
UPDATE users SET deleted_at = NOW() WHERE id = $1;
-- Every query then has:
WHERE deleted_at IS NULLการล้างข้อมูลเก่า
สำหรับการล้างข้อมูลในตารางขนาดใหญ่เป็นระยะ ให้ลบเป็นชุดเพื่อหลีกเลี่ยงธุรกรรมที่ทำงานเป็นเวลานาน:
DELETE FROM events
WHERE id IN (
SELECT id FROM events
WHERE created_at < NOW() - INTERVAL '90 days'
LIMIT 10000
);
-- run this in a loop until it returns 0 rowsTRUNCATE: เมื่อความเร็วสำคัญ
หากต้องการล้างทั้งตารางจริง ๆ TRUNCATE จะเร็วกว่า DELETE เพราะไม่ต้องสแกนแถว แต่จะไม่เรียกใช้ทริกเกอร์ระดับ ROW และไม่สามารถย้อนกลับได้ในทุกการตั้งค่า:
TRUNCATE TABLE staging_orders;
TRUNCATE TABLE staging_orders RESTART IDENTITY CASCADE;RETURNING จาก DELETE
รับแถวที่ถูกลบกลับมา ซึ่งมีประโยชน์สำหรับการเก็บถาวร:
WITH deleted AS (
DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM deleted;สรุป
DELETE เป็นคำสั่งที่อันตรายที่สุด รูปแบบการป้องกันมีดังนี้:
- ใช้ SELECT ก่อน
- ใช้ BEGIN; ... ; ROLLBACK เพื่อจำลองการทำงานโดยไม่บันทึกผล
- แบ่งการลบข้อมูลจำนวนมากเป็นชุด
- เลือกใช้การลบแบบซอฟต์กับข้อมูลที่ผู้ใช้มองเห็น
- ใช้ TRUNCATE เฉพาะกับตารางสำหรับการทดสอบระบบ
ตรวจสอบความเข้าใจอย่างรวดเร็ว
คุณเรียกใช้ DELETE FROM users; โดยไม่มี WHERE คุณควรทำอย่างไร
คำถามที่พบบ่อย
บทเรียน “DELETE ด้วย USING และรูปแบบที่ปลอดภัย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “DELETE ด้วย USING และรูปแบบที่ปลอดภัย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “DELETE ด้วย USING และรูปแบบที่ปลอดภัย”
ลบแถวที่เชื่อมกับตารางอื่นด้วย DELETE ... USING และใช้ธุรกรรมร่วมกับ SELECT ก่อนเพื่อตรวจสอบก่อนดำเนินการที่ทำลายข้อมูล คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “DELETE ด้วย USING และรูปแบบที่ปลอดภัย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- INSERT หลายแถว
- UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
- UPDATE ด้วย FROM และการอัปเดตแบบ JOIN
- DELETE ด้วย USING และรูปแบบที่ปลอดภัย