MySQL / DELETE

DELETE

DELETE командаар хүснэгтийн мөрүүдийг устгана. UPDATE-тэй адилхан WHERE орхивол бүх мөр устгагдах тул маш анхааралтай ашиглах хэрэгтэй.

Үндсэн синтакс

sql
DELETE FROM хүснэгт
WHERE нөхцөл;

Жишээ:

sql
DELETE FROM users
WHERE id = 3;
код
Query OK, 1 row affected (0.01 sec)

Устгалтыг шалгах:

sql
SELECT * FROM users WHERE id = 3;
-- Empty set (0.00 sec)

WHERE-гүй DELETE-ийн аюул

sql
-- АЮУЛГҮЙ: зөвхөн id=3 мөрийг устгана
DELETE FROM users WHERE id = 3;

-- АЮУЛТАЙ: хүснэгтийн БҮХ мөрийг устгана!
DELETE FROM users;

WHERE орхисон DELETE буцаах боломжгүй (transaction ашиглаагүй бол). UPDATE-тай адилхан эхлээд WHERE бодно.


Нөхцөлтэй устгах

sql
-- Идэвхгүй барааг устгах
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 мөрийг устгах:

sql
-- Хамгийн хуучин 100 log устгах
DELETE FROM logs
ORDER BY created_at ASC
LIMIT 100;

TRUNCATE — хүснэгтийг бүрэн цэвэрлэх

sql
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 холбоо тасрахгүй

Хэрэгжүүлэх арга

sql
ALTER TABLE users
  ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL;

Устгах (бодит устгал биш):

sql
UPDATE users
SET deleted_at = CURRENT_TIMESTAMP
WHERE id = 3;

Идэвхтэй мөрүүдийг л харах:

sql
SELECT * FROM users
WHERE deleted_at IS NULL;

Устгасан мөрүүдийг харах:

sql
SELECT * FROM users
WHERE deleted_at IS NOT NULL;

Сэргээх:

sql
UPDATE users
SET deleted_at = NULL
WHERE id = 3;

Жишээ: products хүснэгтэд Soft Delete

sql
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 ашиглан аюулгүй устгах

sql
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-д нэмэх аргуудыг үзнэ.