2010-04-08 59 views
16

Tôi đang cố dọn sạch một bảng nhưng không loại bỏ cấu trúc thực tế của bảng. Tôi có một cột id tự động tăng; Tôi không cần phải giữ số ID, nhưng tôi cần nó để giữ cho đặc tính tăng tự động của nó. Tôi đã tìm thấy xóa và cắt ngắn nhưng tôi lo lắng một trong những điều này sẽ hoàn toàn thả toàn bộ bảng hiển thị các lệnh chèn trong tương lai vô ích.Xóa, Cắt bớt hoặc Thả để làm sạch một bảng trong MySQL

Làm cách nào để xóa tất cả các bản ghi khỏi bảng để tôi có thể chèn dữ liệu mới?

Trả lời

14

TRUNCATE sẽ thiết lập lại hạt giống auto-increment của bạn (trên bảng InnoDB, ít nhất), mặc dù bạn có thể lưu ý giá trị của nó trước khi cắt bỏ và cài lại phù hợp sau đó sử dụng alter table:

ALTER TABLE t2 AUTO_INCREMENT = value 
+0

Điểm tốt khi ghi nhận hạt giống tự động tăng! Tôi quên đề cập đến rằng –

+0

tôi thấy cảm ơn người đàn ông! –

18

drop table sẽ loại bỏ toàn bộ bảng với dữ liệu

delete * from table sẽ xóa dữ liệu, chỉ để lại giá trị tự động. nó cũng mất một thời gian nếu có rất nhiều dữ liệu trong bảng.

truncate table sẽ xóa dữ liệu, đặt lại giá trị tự động (nhưng để chúng dưới dạng cột tự động, vì vậy nó sẽ bắt đầu ở 1 và đi lên từ đó một lần nữa) và rất nhanh.

+0

Đối với InnoDB 'TRUNCATE' không phải là nhanh, bởi vì nó không DROP + TẠO nội bộ. Cắt bớt 200 bảng nhỏ mất vài giây trên hệ thống dev của tôi ... – Marki555

+1

xóa dữ liệu là một thao tác được ghi lại hoàn toàn. Dữ liệu cắt bớt được ghi lại tối thiểu –

1

Một khả năng khác liên quan đến việc tạo ra một bản sao trống của bảng, thiết lập AUTO_INCREMENT (với một số mất nhiều thời gian cuối cùng để chèn trong các hoạt động phi nguyên tử) và sau đó quay cả:

CREATE TABLE t2_new LIKE t2; 

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
    FROM information_schema.tables 
WHERE table_name='t2'; 

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

RENAME TABLE t2 TO t2_old, t2_new TO t2; 

Và sau đó, bạn có thêm lợi thế là vẫn có thể thay đổi suy nghĩ của bạn trước khi xóa bảng cũ.

Nếu bạn xem xét lại quyết định của bạn, bạn vẫn có thể mang lại hồ sơ cũ từ bảng trước khi phẫu thuật:

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/; 

Khi bạn tốt bạn có thể thả bảng cũ:

DROP TABLE t2_old; 
4

      Thả sẽ thực hiện điều đó .... thả bảng được đề cập, trừ khi bảng là cha mẹ sang bảng khác.

      Xóa sẽ xóa tất cả dữ liệu đáp ứng điều kiện; nếu không có điều kiện nào được chỉ định, nó sẽ xóa tất cả dữ liệu trong bảng.
      Cắt ngắn tương tự như xóa; tuy nhiên, nó đặt lại bộ đếm auto_increment về 1 (hoặc giá trị khởi đầu ban đầu). Tuy nhiên, tốt hơn nên sử dụng cắt ngắn hơn xóa vì xóa xóa dữ liệu theo từng hàng, do đó có hiệu suất đạt hơn cắt ngắn.Tuy nhiên, cắt ngắn sẽ không hoạt động trên InnoDB bảng nơi tính toàn vẹn tham chiếu được thực thi trừ khi nó bị tắt trước khi lệnh cắt ngắn được phát hành.
      Vì vậy, hãy thư giãn; trừ khi bạn ra lệnh thả lệnh trên bàn, lệnh sẽ không bị xóa.

Các vấn đề liên quan