คำสั่ง DELETE พร้อม WHERE Clause
ใช้ DELETE FROM table WHERE condition เพื่อลบเฉพาะ Record ที่ตรงเงื่อนไข
ตัวอย่าง: ลบพนักงาน EMP-1002
CREATE TABLE DemoTable615 (
EmployeeId VARCHAR(100),
EmployeeName VARCHAR(100)
);
INSERT INTO DemoTable615 VALUES
('EMP-101', 'Adam'),
('EMP-1001', 'David'),
('EMP-1002', 'Chris'),
('EMP-1003', 'Robert');
Query ลบ:
DELETE FROM DemoTable615 WHERE EmployeeId = 'EMP-1002';
ผลลัพธ์: เหลือ 3 แถว (EMP-1002 หายไป)
+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| EMP-101 | Adam |
| EMP-1001 | David |
| EMP-1003 | Robert |
+------------+--------------+
⚠️ ข้อควรระวังสำคัญ
- ต้องมี WHERE เสมอ -
DELETE FROM tableจะลบทั้งตาราง! - Test ก่อนด้วย SELECT:
SELECT * FROM DemoTable615 WHERE EmployeeId = 'EMP-1002'; -- ตรวจสอบก่อน DELETE FROM DemoTable615 WHERE EmployeeId = 'EMP-1002'; -- ลบจริง - ใช้ Primary Key/Unique Column ใน WHERE - ป้องกันลบผิดหลายแถว
- Transaction: ใช้ BEGIN/COMMIT/ROLLBACK สำหรับ Production
START TRANSACTION; DELETE FROM DemoTable615 WHERE EmployeeId = 'EMP-1002'; -- ตรวจสอบ SELECT * FROM DemoTable615; COMMIT; -- หรือ ROLLBACK ถ้าผิด - Foreign Key: ถ้ามี FK Reference ต้องลบ Child ก่อน หรือตั้ง ON DELETE CASCADE
DELETE vs TRUNCATE vs DROP
| คำสั่ง | ผลลัพธ์ | Rollback ได้ไหม | Auto Increment Reset | Trigger |
|---|---|---|---|---|
| DELETE | ลบ Row เลือกได้ (มี WHERE) | ได้ (ใน Transaction) | ไม่ Reset | Fire |
| TRUNCATE | ลบ ทุก Row (ไม่มี WHERE) | ไม่ได้ (DDL) | Reset | ไม่ Fire |
| DROP TABLE | ลบ Table ทั้งหมด | ไม่ได้ | N/A | N/A |
DELETE จำนวนมาก (Batch Delete)
-- ลบทีละ 1000 แถว ป้องกัน Lock นาน
DELETE FROM large_table
WHERE created_at < '2023-01-01'
LIMIT 1000;
-- วน Loop ใน Application จนกว่า Row Affected = 0
Soft Delete Pattern (แนะนำสำหรับ Production)
ALTER TABLE DemoTable615 ADD COLUMN deleted_at DATETIME NULL DEFAULT NULL;
ADD INDEX idx_deleted (deleted_at);
-- แทน DELETE ให้ UPDATE
UPDATE DemoTable615 SET deleted_at = NOW() WHERE EmployeeId = 'EMP-1002';
-- Query ปกติต้อง WHERE deleted_at IS NULL
SELECT * FROM DemoTable615 WHERE deleted_at IS NULL;