Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL DELETE ระบุ EmployeeId เฉพาะ Record ที่ต้องการลบ

คำสั่ง 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       |
+------------+--------------+

⚠️ ข้อควรระวังสำคัญ

  1. ต้องมี WHERE เสมอ - DELETE FROM table จะลบทั้งตาราง!
  2. Test ก่อนด้วย SELECT:
    SELECT * FROM DemoTable615 WHERE EmployeeId = 'EMP-1002';  -- ตรวจสอบก่อน
    DELETE FROM DemoTable615 WHERE EmployeeId = 'EMP-1002';   -- ลบจริง
  3. ใช้ Primary Key/Unique Column ใน WHERE - ป้องกันลบผิดหลายแถว
  4. Transaction: ใช้ BEGIN/COMMIT/ROLLBACK สำหรับ Production
    START TRANSACTION;
    DELETE FROM DemoTable615 WHERE EmployeeId = 'EMP-1002';
    -- ตรวจสอบ SELECT * FROM DemoTable615;
    COMMIT;  -- หรือ ROLLBACK ถ้าผิด
  5. Foreign Key: ถ้ามี FK Reference ต้องลบ Child ก่อน หรือตั้ง ON DELETE CASCADE

DELETE vs TRUNCATE vs DROP

คำสั่งผลลัพธ์Rollback ได้ไหมAuto Increment ResetTrigger
DELETEลบ Row เลือกได้ (มี WHERE)ได้ (ใน Transaction)ไม่ ResetFire
TRUNCATEลบ ทุก Row (ไม่มี WHERE)ไม่ได้ (DDL)Resetไม่ Fire
DROP TABLEลบ Table ทั้งหมดไม่ได้N/AN/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;