메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
DELETE는 행 전체를 제거합니다. 트랜잭션 밖에서는 되돌리기가 없으므로, 들일 만한 습관은 WHERE를 먼저 쓰고 그것이 무엇을 선택하는지 보는 것입니다. 이 예제들은 INSERT의 sakila_practice 데이터베이스를 사용합니다. 시작하기 전에 그곳의 설정 블록을 다시 실행한 다음, mysql -u root -p sakila_practice로 클라이언트를 여세요.

DELETE의 동작 방식

TABLE_NAME을 테이블로, CONDITION을 제거할 행을 고르는 검사로 바꾸세요. 열 목록은 없습니다. DELETE는 행 전체를 제거하므로, 열 1개를 비우는 것은 그것을 NULL로 설정하는 UPDATE입니다.

예제

  1. 먼저 보고, 그다음 삭제하기

WHERE를 SELECT로 쓰고 곧 잃게 될 행을 읽으세요.
행 하나이고, 의도한 바로 그 행입니다. 이제 문장의 앞부분만 바꾸고 WHERE는 그대로 두세요.
DELETE는 영향받은 행 수만 보고하고 그 밖에는 아무것도 보고하지 않습니다. UPDATE는 Rows matched와 Changed가 있는 두 번째 줄을 출력하지만, DELETE에는 그에 해당하는 것이 없습니다.

  1. 아무것과도 일치하지 않는 WHERE는 오류가 아닙니다

아무것도 잘못되지 않았고 아무 일도 일어나지 않았습니다. 동작할 것으로 예상한 삭제 뒤의 0 rows affected는 WHERE가 틀렸다는 뜻이고, 문장은 그렇다고 말해 주지 않습니다.

WHERE가 없으면 테이블을 비웁니다

안전 업데이트 모드는 이 형태를 거부하는데, WHERE에 키가 없는 UPDATE를 거부하는 것과 정확히 같습니다. UPDATE가 그것이 내는 ERROR 1175를 보여 주고, mysql -u root -p --safe-updates sakila_practice가 세션 전체에 대해 그것을 켭니다.

TRUNCATE는 다르게 비웁니다

테이블이 비어 있으므로, 행을 하나 삽입하고 그 id를 보세요.
카운터는 DELETE가 제거한 행에서 이어졌습니다. TRUNCATE TABLE은 그렇지 않습니다.
TRUNCATE는 테이블을 삭제하고 빈 테이블을 만들며, 그래서 몇 개의 행을 제거했든 0 rows affected를 보고하고 카운터가 처음부터 다시 시작합니다. WHERE를 받지 않고, 롤백할 수 없으며, DELETE 트리거를 실행하지 않습니다. 테이블을 빈 상태로 되돌리려면 TRUNCATE를, 그 밖의 모든 경우에는 DELETE를 사용하세요.

요약

  • DELETE FROM table WHERE condition으로 쓰고, WHERE를 먼저 SELECT로 실행하세요.
  • 행 수만 나오고 Rows matched 줄은 없다고 예상하세요.
  • 0 rows affected는 실패가 아니라 아무것도 찾지 못한 WHERE로 읽으세요.
  • WHERE를 빼면 확인 단계 없이 테이블이 비워집니다.
  • 테이블을 비우고 초기화하려면 되돌릴 수 없다는 점을 알고 TRUNCATE TABLE을 사용하세요.

함께 보기

  • UPDATE — 행 변경과 안전 업데이트 보호 장치
  • WHERE — 어떤 행이 사라질지 결정하는 절
  • 트랜잭션 — DELETE를 되돌리는 유일한 방법
  • MySQL의 소프트 삭제 — 행을 제거하는 대신 사라진 것으로 표시하기