[๋ฐ๋ธ์ฝ์ค] about delete
DELETE์ TRUNCATE์ ์ฐจ์ด
DELETE
์ TRUNCATE
๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๋ช
๋ น์ด๋ค. ํ์ง๋ง ๋์ ๋ฐฉ์๊ณผ ํน์ง์ ์ฐจ์ด๊ฐ ์๋ค.
1. DELETE
DELETE FROM ํ ์ด๋ธ๋ช WHERE ์กฐ๊ฑด;
ํํ๋ก ์ฌ์ฉํ๋ค.- ์กฐ๊ฑด์ ์ง์ ํ๋ฉด ํด๋น ์กฐ๊ฑด์ ๋ง๋ ํ๋ง ์ญ์ ํ๋ค.
- ์กฐ๊ฑด์ ์๋ตํ๋ฉด ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์ญ์ ํ๋ค.
- ํ ํ์ฉ ์ญ์ ํ๋ฉฐ, ์ญ์ ๋ ํ๋ง๋ค ํธ๋์ญ์ ๋ก๊ทธ๊ฐ ๊ธฐ๋ก๋๋ค.
- ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด(Foreign Key Constraint)์ด ๊ฑธ๋ ค ์์ผ๋ฉด, ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฐ๋ผ ์ญ์ ๊ฐ ์ ํ๋ ์ ์๋ค.
- ์๋ ์ฆ๊ฐ(auto_increment) ๊ฐ์ ์ด๊ธฐํ๋์ง ์๋๋ค.
- ๋กค๋ฐฑ(rollback)์ด ๊ฐ๋ฅํ๋ค.
2. TRUNCATE
TRUNCATE TABLE ํ ์ด๋ธ๋ช ;
ํํ๋ก ์ฌ์ฉํ๋ค.- ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ญ์ ํ๋ค. ์กฐ๊ฑด ์ง์ ๋ถ๊ฐ.
- ํ ์ด๋ธ ๊ตฌ์กฐ์ ์ปฌ๋ผ, ์ธ๋ฑ์ค ๋ฑ์ ๊ทธ๋๋ก ๋จ๋๋ค.
- ํธ๋์ญ์ ๋ก๊ทธ๊ฐ ์ต์ํ๋์ด ๋๋ ๋ฐ์ดํฐ ์ญ์ ์ ๋น ๋ฅด๋ค.
- ์๋ ์ฆ๊ฐ(auto_increment) ๊ฐ์ด ์ด๊ธฐํ๋๋ค.
- ๋กค๋ฐฑ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค(DBMS๋ง๋ค ๋ค๋ฆ).
- ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ด ๊ฑธ๋ ค ์์ผ๋ฉด ์คํ์ด ์ ํ๋ ์ ์๋ค.
SET FOREIGN_KEY_CHECKS = 0 ์ค๋ช
MySQL ๋ฑ์์๋ ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ด ํ์ฑํ๋์ด ์์ผ๋ฉด, ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ํด์น์ง ์๋๋ก ๋ฐ์ดํฐ ์ญ์ /์์ ์ด ์ ํ๋๋ค.SET FOREIGN_KEY_CHECKS = 0;
๋ช
๋ น์ด๋ ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ ์ผ์์ ์ผ๋ก ๋นํ์ฑํํ๋ค.
์ด ์ํ์์๋ ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ ์๊ด์์ด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
์์
์ด ๋๋ ํ์๋ ๋ฐ๋์ SET FOREIGN_KEY_CHECKS = 1;
๋ก ๋ค์ ํ์ฑํํด์ผ ํ๋ค.
์์ 1: SQL๋ก ๋ฐ์ดํฐ ์ญ์
์๋๋ ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ด ์๋ ํ ์ด๋ธ์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์์ ๋ค.
-- ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด ๋นํ์ฑํ
SET FOREIGN_KEY_CHECKS = 0;
-- ํ
์ด๋ธ ๋ฐ์ดํฐ ์ ์ฒด ์ญ์
DELETE FROM child_table;
DELETE FROM parent_table;
-- ๋๋
TRUNCATE TABLE child_table;
TRUNCATE TABLE parent_table;
-- ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด ๋ค์ ํ์ฑํ
SET FOREIGN_KEY_CHECKS = 1;
์ด๋ ๊ฒ ํ๋ฉด ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด ๋๋ฌธ์ ๋ฐ์ํ๋ ์ค๋ฅ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์ ์๋ค.
๋จ, ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด์ ๋นํ์ฑํํ ์ํ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ์ ์์ผ๋, ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค.
2. ์ฝ๋ ์์
OrderService.js
// ... ๊ธฐ์กด ์ฝ๋ ...
class OrderService {
constructor(db) {
this.db = db; // mysql2/promise ์ปค๋ฅ์
ํ
}
async deleteOrder(orderId) {
const conn = await this.db.getConnection();
try {
await conn.beginTransaction();
// ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด ๋นํ์ฑํ
await conn.query('SET FOREIGN_KEY_CHECKS = 0');
// ํ์ ํ
์ด๋ธ(์: order_items) ๋จผ์ ์ญ์
await conn.query('DELETE FROM order_items WHERE order_id = ?', [orderId]);
// ์ฃผ๋ฌธ ํ
์ด๋ธ์์ ์ญ์
await conn.query('DELETE FROM orders WHERE id = ?', [orderId]);
// ์ธ๋ ํค ์ ์ฝ์กฐ๊ฑด ๋ค์ ํ์ฑํ
await conn.query('SET FOREIGN_KEY_CHECKS = 1');
await conn.commit();
} catch (err) {
await conn.rollback();
throw err;
} finally {
conn.release();
}
}
}
// ... ๊ธฐ์กด ์ฝ๋ ...
OrderController.js
// ... ๊ธฐ์กด ์ฝ๋ ...
const express = require('express');
const router = express.Router();
const OrderService = require('./OrderService');
const db = require('../config/db'); // mysql2/promise ์ปค๋ฅ์
ํ
const orderService = new OrderService(db);
router.delete('/orders/:id', async (req, res) => {
const orderId = req.params.id;
try {
await orderService.deleteOrder(orderId);
res.status(200).json({ message: '์ฃผ๋ฌธ์ด ์ญ์ ๋์์ต๋๋ค.' });
} catch (err) {
res.status(500).json({ message: '์ฃผ๋ฌธ ์ญ์ ์คํจ', error: err.message });
}
});
module.exports = router;
// ... ๊ธฐ์กด ์ฝ๋ ...
์ ๋ฆฌ
- ์๋น์ค์์ ํธ๋์ญ์ ๊ณผ ์ธ๋ ํค ์ฒดํฌ๋ฅผ ์ง์ ๊ด๋ฆฌ
- ํ์ ํ ์ด๋ธ โ ์์ ํ ์ด๋ธ ์์๋ก ์ญ์
- ์ปจํธ๋กค๋ฌ์์ ์๋น์ค ํธ์ถ ํ ๊ฒฐ๊ณผ ๋ฐํ
- ์ค๋ฌด์์๋ ์ธ๋ ํค ์ฒดํฌ๋ฅผ ์์ฃผ ๋์ง ์์ผ๋, ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ