MySQL Xóa tất cả các hàng khỏi bảng và đặt lại ID về 0


182

Tôi cần xóa tất cả các hàng khỏi một bảng nhưng khi tôi thêm một hàng mới, tôi muốn ID khóa chính, có mức tăng tự động, để bắt đầu lại từ 0 tương ứng từ 1.

Câu trả lời:


303

Không xóa, sử dụng cắt ngắn:

Truncate table XXX

Trình xử lý bảng không nhớ giá trị AUTO_INCREMENT được sử dụng lần cuối, nhưng bắt đầu đếm từ đầu. Điều này đúng ngay cả với MyISAM và InnoDB, thông thường không sử dụng lại các giá trị chuỗi.

Nguồn .


20
Cắt ngắn hoạt động tốt với các bảng không bị ràng buộc, nhưng nếu bảng của bạn có ràng buộc Khóa ngoài, bạn có thể xem xét sử dụng phương thức Xóa. Xem bài đăng này nếu bạn có các ràng buộc FK: cắt bớt bảng ràng buộc khóa ngoại
Julian Soro

1
hãy nhớ rằng bảng rút gọn sẽ không quay trở lại
penny chan

83

Nếu bạn không thể sử dụng TRUNCATE(ví dụ do các ràng buộc khóa ngoài), bạn có thể sử dụng bảng thay đổi sau khi xóa tất cả các hàng để khởi động lại auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav Vì bạn có thể đang sử dụng công cụ InnoDB trên bàn của mình thay vì MyISAM, lần đầu tiên không hỗ trợ đặt lại chỉ mục.
Gustavo Rubio

cách xóa tất cả các hàng trước khi thay đổi giá trị auto_increment
Kasun Siyambalapitiya

@KasunSiyambalapitiya DELETE FROM tablename;(nhưng điều đó sẽ không hoạt động tốt khi có các ràng buộc FK - xem stackoverflow.com/a/5452798/507761 )
Matthew Đọc

17

Nếu bảng có khóa ngoại thì tôi luôn sử dụng mã sau:

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 ;

Nhưng sự khác biệt sẽ là trong thời gian thực hiện. Nhìn vào câu trả lời của Sorin ở trên.


2
Đây là một cách tốt để có dữ liệu mồ côi trong bất kỳ bảng nào có khóa ngoại đối với bảng mà bạn đang xóa sạch. Việc kích hoạt kiểm tra khóa ngoại sau khi thực tế không khiến MySQL xác nhận lại các khóa ngoại đó theo như tôi biết. Điều này để lại cho bạn các hàng chứa dữ liệu không tồn tại trong bảng tham chiếu. Bạn thậm chí thể không khóa ngoại trên bàn của bạn.
cimmanon

8

Một thực tế thú vị.

Tôi chắc chắn TRUNCATEsẽ luôn hoạt động tốt hơn, nhưng trong trường hợp của tôi, đối với cơ sở dữ liệu có khoảng 30 bảng có khóa ngoại, chỉ có một vài hàng, phải mất khoảng 12 giây cho TRUNCATEtất cả các bảng, thay vì chỉ vài trăm mili giâyDELETE các hàng. Đặt tăng tự động thêm tổng cộng khoảng một giây, nhưng vẫn tốt hơn rất nhiều.

Vì vậy, tôi sẽ đề nghị thử cả hai, xem cái nào hoạt động nhanh hơn cho trường hợp của bạn.


2

nếu bạn muốn sử truncatedụng, hãy sử dụng cái này:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.