DELETE เป็นคำสั่ง DML (Data Manipulation Language) ใช้ลบแถว/ระเบียน (Rows/Tuples) จากตาราง ในขณะที่ DROP เป็นคำสั่ง DDL (Data Definition Language) ใช้ลบโครงสร้าง (Schema Objects) เช่น ตาราง, Constraints, Index, Database ทั้งหมด
ตารางเปรียบเทียบความแตกต่างสำคัญ
| ลำดับ | หัวข้อ | DELETE | DROP |
|---|---|---|---|
| 1 | วัตถุประสงค์ | ลบบางส่วนหรือทั้งหมดของแถวในตาราง | ลบองค์ประกอบ Schema: ตาราง, Constraints, Schema ทั้งหมด |
| 2 | ประเภทภาษา | DML (Data Manipulation Language) | DDL (Data Definition Language) |
| 3 | Clause | ใช้ WHERE กรองแถวที่จะลบได้ | ไม่มี WHERE Clause |
| 4 | Rollback | Rollback ได้ (ทำงานใน Buffer/Transaction Log) | Rollback ไม่ได้ (ทำงานตรงโครงสร้าง metadata) |
| 5 | พื้นที่หน่วยความจำ | ไม่ปล่อยพื้นที่ตาราง แม้ลบทุกแถว | ปล่อยพื้นที่หน่วยความจำ |
| 6 | ปัญหาที่อาจเกิด | อาจขาดหน่วยความจำ (Transaction Log ใหญ่) | อาจทำให้ Memory Fragmentation |
หมายเหตุ: แถว 6-8 ในตารางต้นฉบับมีข้อมูลซ้ำ/ผิด (เกี่ยวกับ PL/SQL) จึงตัดออก
คำสั่งตัวอย่าง
-- DELETE: ลบข้อมูล แต่อยู่โครงสร้างตาราง DELETE FROM employees WHERE department_id = 10; DELETE FROM employees; -- ลบทุกแถว (Slow, Log ทุกแถว) -- TRUNCATE: ลบทุกแถว เร็วกว่า DELETE รีเซ็ต Identity ไม่ Rollback ได้ TRUNCATE TABLE employees; -- DROP: ลบตารางทั้งหมด (โครงสร้าง + ข้อมูล + Index + Constraints) DROP TABLE employees; -- DROP อื่นๆ DROP INDEX idx_name ON table_name; DROP DATABASE db_name; DROP VIEW view_name;
สรุปการเลือกใช้
- DELETE: ลบข้อมูลเฉพาะบางแถว ต้องการ Rollback ต้องการ Trigger ไปด้วย
- TRUNCATE: ลบทุกแถว เร็ว ไม่ต้อง Rollback รีเซ็ต Auto Increment
- DROP: ลบโครงสร้างตาราง/ออบเจกต์หมด ไม่กลับคืนได้
ข้อควรระวัง
- DROP ไม่สามารถกู้คืนได้ (ยกเว้นมี Backup หรือ Flashback ในบาง DB)
- DELETE ทุกแถวในตารางใหญ่ ใช้เวลานาน และ Transaction Log ใหญ่ → ควรแบ่ง Batch หรือใช้ TRUNCATE
- Foreign Key Constraints อาจบล็อก DROP/DELETE ต้อง Disable/L Drop FK ก่อน