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.
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:
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 .
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
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 )
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.
Một thực tế thú vị.
Tôi chắc chắn TRUNCATE
sẽ 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 TRUNCATE
tấ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.