DELETE
DELETE командаар хүснэгтийн мөрүүдийг устгана. UPDATE-тэй адилхан WHERE орхивол бүх мөр устгагдах тул маш анхааралтай ашиглах хэрэгтэй.
Үндсэн синтакс
DELETE FROM хүснэгт
WHERE нөхцөл;
Жишээ:
DELETE FROM users
WHERE id = 3;
Query OK, 1 row affected (0.01 sec)
Устгалтыг шалгах:
SELECT * FROM users WHERE id = 3;
-- Empty set (0.00 sec)
WHERE-гүй DELETE-ийн аюул
-- АЮУЛГҮЙ: зөвхөн id=3 мөрийг устгана
DELETE FROM users WHERE id = 3;
-- АЮУЛТАЙ: хүснэгтийн БҮХ мөрийг устгана!
DELETE FROM users;
WHERE орхисон DELETE буцаах боломжгүй (transaction ашиглаагүй бол). UPDATE-тай адилхан эхлээд WHERE бодно.
Нөхцөлтэй устгах
-- Идэвхгүй барааг устгах
DELETE FROM products
WHERE is_active = FALSE;
-- Хуучин захиалгуудыг устгах
DELETE FROM orders
WHERE created_at < '2023-01-01';
-- Олон ID нэгэн зэрэг устгах
DELETE FROM users
WHERE id IN (5, 6, 7);
-- Нөөцгүй бараануудыг устгах
DELETE FROM products
WHERE stock = 0 AND is_active = FALSE;
DELETE + ORDER BY + LIMIT
Хамгийн хуучин N мөрийг устгах:
-- Хамгийн хуучин 100 log устгах
DELETE FROM logs
ORDER BY created_at ASC
LIMIT 100;
TRUNCATE — хүснэгтийг бүрэн цэвэрлэх
TRUNCATE TABLE logs;
TRUNCATE нь хүснэгтийн бүх мөрийг устгаад AUTO_INCREMENT-ийн тоолуурыг 1-ээс эхлэн шинэчилнэ.
DELETE vs TRUNCATE
| | DELETE | TRUNCATE |
| ---------------- | --------------------------- | ---------------- |
| WHERE нөхцөл | Тийм | Үгүй |
| AUTO_INCREMENT | Тоолуур үргэлжлэнэ | 1-ээс эхлэнэ |
| Transaction | Буцаах боломжтой | Буцаах боломжгүй |
| Хурд | Удаан (мөр бүрийг бүртгэнэ) | Хурдан |
| Trigger | Ажиллана | Ажиллахгүй |
Хэзээ TRUNCATE ашиглах: Туршилтын өгөгдлийг бүрэн цэвэрлэхэд, log хүснэгтийг хоослоход.
Хэзээ DELETE ашиглах: Нөхцөлтэй устгахад, transaction дотор буцаах шаардлагатай үед.
Soft Delete загвар
Бодит системд өгөгдлийг физикийн байдлаар устгахын оронд "устгасан" гэж тэмдэглэх загвар өргөн хэрэглэгддэг. Энийг Soft Delete гэнэ.
Яагаад Soft Delete?
- Устгасан өгөгдлийг сэргээх боломжтой
- Аудит, түүх хадгалах шаардлагатай системд зайлшгүй
- Foreign key холбоо тасрахгүй
Хэрэгжүүлэх арга
ALTER TABLE users
ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL;
Устгах (бодит устгал биш):
UPDATE users
SET deleted_at = CURRENT_TIMESTAMP
WHERE id = 3;
Идэвхтэй мөрүүдийг л харах:
SELECT * FROM users
WHERE deleted_at IS NULL;
Устгасан мөрүүдийг харах:
SELECT * FROM users
WHERE deleted_at IS NOT NULL;
Сэргээх:
UPDATE users
SET deleted_at = NULL
WHERE id = 3;
Жишээ: products хүснэгтэд Soft Delete
ALTER TABLE products
ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL;
-- Бараа "устгах"
UPDATE products
SET deleted_at = NOW()
WHERE id = 4;
-- Дэлгүүрийн хуудсанд зөвхөн идэвхтэй бараа харуулах
SELECT name, price, stock
FROM products
WHERE deleted_at IS NULL
AND is_active = TRUE
ORDER BY created_at DESC;
Transaction ашиглан аюулгүй устгах
START TRANSACTION;
DELETE FROM orders
WHERE created_at < '2023-01-01';
-- Хэдэн мөр устгагдсаныг шалгах
SELECT ROW_COUNT();
-- Зөв бол хадгалах
COMMIT;
-- Буруу бол буцаах
-- ROLLBACK;
ROW_COUNT() — сүүлчийн DELETE буюу UPDATE-д нөлөөлсөн мөрийн тоог буцаана.
Дараагийн хичээлд:
Constraint — PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT тодорхойлох, нэрлэх, ALTER TABLE-д нэмэх аргуудыг үзнэ.