MySQL 테이블에서 모든 행을 삭제하고 ID를 0으로 재설정


183

테이블에서 모든 행을 삭제해야하지만 새 행을 추가 할 때 자동 증가가있는 기본 키 ID가 1에서 각각 0에서 다시 시작되기를 원합니다.

답변:


304

삭제하지 말고 자르십시오.

Truncate table XXX

테이블 핸들러는 마지막으로 사용한 AUTO_INCREMENT 값을 기억하지 않지만 처음부터 계산을 시작합니다. 일반적으로 시퀀스 값을 재사용하지 않는 MyISAM 및 InnoDB의 경우에도 마찬가지입니다.

소스 .


20
잘림은 제한되지 않은 테이블에서 잘 작동하지만 테이블에 외래 키 제약 조건이 있으면 Delete 메서드 사용을 고려할 수 있습니다. 당신이 FK 제약 조건이있는 경우 해당 게시물을 참조 : 잘라 내기 외래 키 테이블 제약
줄리안 소로

1
그 잘라 내기 테이블을 기억하고 롤백하지 않을
페니 짱

83

TRUNCATE외래 키 제약 조건으로 인해 사용할 수없는 경우 모든 행을 삭제 한 후 alter 테이블을 사용하여 auto_increment를 다시 시작할 수 있습니다.

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav MyISAM 대신 테이블에서 InnoDB 엔진을 사용 중일 수 있으므로 첫 번째는 인덱스 재설정을 지원하지 않습니다.
구스타보 루비오

auto_increment 값을 변경하기 전에 모든 행을 삭제하는 방법
Kasun Siyambalapitiya

@KasunSiyambalapitiya DELETE FROM tablename;(그러나이 FK 제약이 잘 때 작동하지 않을 - 참조 stackoverflow.com/a/5452798/507761을 )
마태 복음 읽기

17

테이블에 외래 키가 있으면 항상 다음 코드를 사용합니다.

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

그러나 실행 시간에 차이가 있습니다. 위의 Sorin의 답변을보십시오.


2
이것은 제거하려는 테이블의 외래 키가있는 테이블에 고아 데이터를 저장하는 좋은 방법입니다. 사실 이후 외래 키 검사를 활성화해도 MySQL은 내가 아는 한 외래 키를 다시 확인하지 않습니다. 그러면 참조 테이블에 존재하지 않는 데이터가 포함 된 행이 남습니다 . 테이블에 외래 키 전혀 없을 수도 있습니다 .
cimmanon

8

흥미로운 사실.

나는 TRUNCATE항상 더 잘 수행 할 것이라고 확신 했지만, 내 경우에는 외래 키가 약 30 개의 테이블이 있고 몇 행만 채워진 데이터베이스의 경우 TRUNCATE수백 밀리 초가 아닌 모든 테이블 에 약 12 ​​초가 걸렸습니다 DELETE. 행. 자동 증분을 설정하면 약 1 초가 추가되지만 여전히 훨씬 좋습니다.

따라서 두 가지를 모두 시도해보십시오. 귀하의 경우 더 빨리 작동하는 것을보십시오.


2

사용 truncate하려면 이것을 사용하십시오 :

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.