0Pricing
SQL Academy · บทเรียน

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 rows

TRUNCATE: เมื่อความเร็วสำคัญ

หากต้องการล้างทั้งตารางจริง ๆ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. INSERT หลายแถว
  2. UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
  3. UPDATE ด้วย FROM และการอัปเดตแบบ JOIN
  4. DELETE ด้วย USING และรูปแบบที่ปลอดภัย
← กลับไปที่ SQL Academy