USING을 사용한 DELETE와 안전한 패턴
DELETE ... USING으로 다른 테이블과 조인된 행을 삭제하고, 파괴적인 작업 전에 트랜잭션과 SELECT를 사용해 먼저 확인합니다.
USING을 사용한 DELETE와 안전한 패턴은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
기본 DELETE
조건에 맞는 행을 삭제합니다:
DELETE FROM users WHERE id = 1;항상 먼저 SELECT로 테스트하십시오
DELETE를 실행하기 전에 같은 WHERE 조건을 사용해 SELECT를 실행하여 행 수를 확인합니다:
SELECT COUNT(*) FROM orders
WHERE status = 'cancelled' AND created_at < NOW() - INTERVAL '1 year';트랜잭션에서 DELETE하기
삭제 작업을 트랜잭션으로 감싸 ROLLBACK할 수 있게 하십시오:
BEGIN;
DELETE FROM orders WHERE status = 'cancelled' AND ...;
SELECT COUNT(*) FROM orders; -- sanity check
-- COMMIT; or ROLLBACK;WHERE 없는 DELETE는 재앙입니다
DELETE FROM users;는 테이블을 비웁니다. 되돌리기 버튼은 없습니다. 항상 신중하게 작성하십시오. WHERE를 입력하는 데 1초를 더 쓰는 것은 저렴한 예방책입니다.
DELETE … USING (PostgreSQL JOIN 삭제)
다른 테이블을 기준으로 한 테이블의 행을 삭제합니다:
DELETE FROM orders o
USING users u
WHERE u.id = o.user_id
AND u.is_banned = true;서브쿼리를 사용하는 DELETE
표준적인 대안입니다:
DELETE FROM orders
WHERE user_id IN (SELECT id FROM users WHERE is_banned);외래 키 CASCADE
orders.user_id에 ON DELETE CASCADE가 있으면 사용자를 삭제할 때 해당 사용자의 주문도 자동으로 삭제됩니다. 편리하지만 위험하므로 신중하게 사용하십시오.
ALTER TABLE orders
ADD CONSTRAINT orders_user_fk
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE;소프트 삭제
많은 앱은 행을 실제로 삭제하지 않고 deleted_at 타임스탬프를 설정합니다:
UPDATE users SET deleted_at = NOW() WHERE id = $1;
-- Every query then has:
WHERE deleted_at IS NULL오래된 데이터 정리
대형 테이블을 주기적으로 정리할 때는 장시간 실행되는 트랜잭션을 피하도록 여러 묶음으로 나누어 삭제합니다:
DELETE FROM events
WHERE id IN (
SELECT id FROM events
WHERE created_at < NOW() - INTERVAL '90 days'
LIMIT 10000
);
-- run this in a loop until it returns 0 rowsTRUNCATE: 속도가 중요할 때
테이블을 완전히 비우려는 경우 TRUNCATE는 행을 검색하지 않으므로 DELETE보다 빠릅니다. 하지만 ROW 트리거를 실행하지 않으며 모든 환경에서 ROLLBACK할 수 있는 것도 아닙니다:
TRUNCATE TABLE staging_orders;
TRUNCATE TABLE staging_orders RESTART IDENTITY CASCADE;DELETE에서 RETURNING 사용
삭제된 행을 반환하므로 보관 작업에 유용합니다:
WITH deleted AS (
DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM deleted;요약
DELETE는 가장 위험한 명령문입니다. 방어적인 패턴은 다음과 같습니다:
- 먼저 SELECT 실행
- 시험 실행으로 BEGIN; ... ; ROLLBACK 사용
- 대량 DELETE는 여러 묶음으로 나누기
- 사용자에게 보이는 데이터에는 소프트 삭제 우선 사용
- TRUNCATE는 스테이징 테이블에서만 사용
빠른 확인
WHERE 없이 DELETE FROM users;를 실행했습니다. 어떻게 해야 합니까?
자주 묻는 질문
“USING을 사용한 DELETE와 안전한 패턴” 강의는 무료인가요?
네 — “USING을 사용한 DELETE와 안전한 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“USING을 사용한 DELETE와 안전한 패턴”에서 뭘 배우나요?
DELETE ... USING으로 다른 테이블과 조인된 행을 삭제하고, 파괴적인 작업 전에 트랜잭션과 SELECT를 사용해 먼저 확인합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“USING을 사용한 DELETE와 안전한 패턴” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 여러 행을 한 번에 INSERT
- UPSERT: ON CONFLICT DO UPDATE(PostgreSQL)
- FROM과 JOIN 방식의 UPDATE
- USING을 사용한 DELETE와 안전한 패턴