Làm cách nào để thiết lập lại AUTO_INCREMENT trong MySQL?


1246

Làm thế nào tôi có thể thiết lập lại các AUTO_INCREMENTcủa một trường?
Tôi muốn nó bắt đầu đếm 1lại từ đầu .


9
Bạn có thể nhận được phản hồi tốt hơn trên trang web dành cho các DBA tại dba.stackexchange.com
Rowland Shaw

80
Có lẽ bạn cũng muốn dọn bàn:TRUNCATE TABLE yourTableName;
Konerak


3
vâng, bảng cắt ngắn là tốt nhất trong trường hợp này. nó cũng thiết lập lại mức tăng tự động bắt đầu thành 1.
raidsan

2
Đôi khi bạn không có quyền TRUNCATE vì điều đó yêu cầu quyền DROP.
Luke anh em họ

Câu trả lời:


2024

Bạn có thể đặt lại bộ đếm với:

ALTER TABLE tablename AUTO_INCREMENT = 1

Đối với InnoDB, bạn không thể đặt auto_incrementgiá trị thấp hơn hoặc bằng với chỉ mục hiện tại cao nhất. (trích dẫn từ ViralPatel ):

Lưu ý rằng bạn không thể đặt lại bộ đếm về giá trị nhỏ hơn hoặc bằng bất kỳ giá trị nào đã được sử dụng. Đối với MyISAM, nếu giá trị nhỏ hơn hoặc bằng giá trị tối đa hiện tại trong cột AUTO_INCREMENT, giá trị được đặt lại về mức tối đa hiện tại cộng với một. Đối với InnoDB, nếu giá trị nhỏ hơn giá trị tối đa hiện tại trong cột, không xảy ra lỗi và giá trị chuỗi hiện tại không thay đổi.

Xem Làm thế nào để thiết lập lại AutoIncrement bằng giá trị MAX từ một bảng khác? về cách năng động để có được một giá trị chấp nhận được.


8
Điều này có thể mất mãi mãi cho một bảng đầy. Hãy cẩn thận với điều này: stackoverflow.com/questions/2681869/ từ
BT

52
đây làcircular reference
Besnik

5
Bạn có ý nghĩa curcular referencegì?
Niels

73
Hãy nhớ rằng MySql sẽ tạo một bảng mới, với cùng cấu trúc và giá trị auto_increment mới và sao chép tất cả các bản ghi từ bảng gốc, bỏ bản gốc và đổi tên bảng mới. Điều này có thể có tác động hiệu suất đáng kể (và không gian đĩa) trên môi trường sản xuất nếu bảng lớn.
Rostol

6
Câu trả lời được bình chọn cao này có thực sự hiệu quả nếu bạn đã có cột AUTOINCREMENT không? Theo tài liệu MySQL 5.1: "Bạn không thể đặt lại bộ đếm thành giá trị nhỏ hơn hoặc bằng bất kỳ giá trị nào đã được sử dụng. Đối với MyISAM, nếu giá trị nhỏ hơn hoặc bằng giá trị tối đa hiện tại trong cột AUTO_INCREMENT, thì giá trị được đặt lại về mức tối đa hiện tại cộng với một. Đối với InnoDB, nếu giá trị nhỏ hơn giá trị tối đa hiện tại trong cột, không có lỗi xảy ra và giá trị chuỗi hiện tại không thay đổi. " Âm thanh như sẽ không có gì xảy ra ở đây nếu độ tự động lớn hơn 1.
tham lam

160
ALTER TABLE tablename AUTO_INCREMENT = 1

7
Tôi có thể biết sự khác biệt giữa câu trả lời của bạn và câu trả lời trước đó không
Praveen Srinivasan

30
@PraveenSrinivasan không có sự khác biệt, chúng tôi đã thêm chúng cùng một lúc
boobiq

79
Cá nhân, tôi nghĩ rằng một điều tuyệt vời là hai câu trả lời cho câu hỏi AUTO_INCREMENT đã có một sự va chạm đồng thời :-)
Đánh dấu Goldfain vào

@MarkGoldfain đúng rồi!
máy tính

đồng thời sẽ gây ra tình trạng cuộc đua mysql ...
Syamsoul Azrien

81
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Tôi nghĩ rằng điều này sẽ làm điều đó


2
Câu hỏi này đã có một câu trả lời thích hợp. Hơn nữa, bạn UPDATEsẽ cập nhật tất cả các giá trị trong idcột.
Kermit

2
OP không tuyên bố họ đang sắp xếp lại các hàng hiện có.
Kermit

Câu trả lời đầy đủ và hoàn hảo. Nhưng tôi có một nghi ngờ rằng khi chúng ta chèn một giá trị mới, PK của giá trị đó sẽ là gì. Cho dù đó là 1 hay PK tiếp theo?
Prifulnath

vâng đây là giải pháp tốt nhất, nhưng bạn có thể muốn khóa các bảng nếu có dữ liệu được ghi, ví dụ như các bảng sản xuất
wavvves

Rất hữu ích, tôi có cùng một yêu cầu khi tôi phải đặt lại mức tăng tự động để bắt đầu bằng 1, chỉ có hai lệnh đầu tiên được trợ giúp.
LOKENDRA


40

nhập mô tả hình ảnh ở đâyCó một cách rất dễ dàng với phpmyadmin trong tab "thao tác", bạn có thể đặt, trong các tùy chọn bảng, tự động gửi đến số bạn muốn.


Bạn cần khởi động lại dịch vụ / máy chủ mysql ngay sau đó.
Cyber

1
Tôi không nghĩ bạn cần khởi động lại máy chủ của mình sau đó. PhpAdmin sẽ chỉ chạy lệnh để thay đổi điểm bắt đầu tăng.
Kareem

Bạn không cần phải khởi động lại, nó có hiệu lực từ lần chèn tiếp theo.
IloidiumPu36

36

Giải pháp tốt nhất phù hợp với tôi:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

Nó nhanh, hoạt động với innoDB và tôi không cần biết giá trị tối đa hiện tại! Bằng cách này, bộ đếm tăng tự động sẽ đặt lại và nó sẽ tự động bắt đầu từ giá trị tối đa tồn tại.


1
nó sẽ đặt giá trị tự động NULL trên information_schema; kiểm traSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Tôi đã thử nghiệm trên phiên bản 5.6.x và điều này đã hoạt động hoàn hảo và truy vấn của Kerem Güneş đã trả về giá trị tối đa cộng với một, KHÔNG null như đã nêu. (có thể nó được đặt thành null sau truy vấn đầu tiên, nhưng không phải sau truy vấn thứ hai) Tôi tin rằng đây là giải pháp tốt nhất cho InnoDB.
Frank Forte

Giống như đặt giá trị rõ ràng: "tạo bảng mới, có cùng cấu trúc và giá trị auto_increment mới và sao chép tất cả các bản ghi từ bảng gốc, bỏ bản gốc và đổi tên bảng mới. Điều này có thể có tác động hiệu suất đáng kể (và không gian đĩa) trên môi trường sản xuất nếu bàn lớn. " nhưng tồi tệ hơn nhiều vì cần bảng sao chép đầy đủ hai lần.
Enyby

Tôi xác nhận rằng đây làm việc cho phiên bản 5.6.15, trong khi ALTER TABLE tablename AUTO_INCREMENT = 1thực hiện không .
Nae

24

Tất cả các câu trả lời được xếp hạng cao nhất cho câu hỏi này đều đề xuất "ALTER yourtable AUTO_INCREMENT = value". Tuy nhiên, điều này chỉ hoạt động khi valuetrong thay đổi lớn hơn giá trị tối đa hiện tại của cột tự động. Theo tài liệu MySQL 8 :

Bạn không thể đặt lại bộ đếm thành giá trị nhỏ hơn hoặc bằng giá trị hiện đang sử dụng. Đối với cả InnoDB và MyISAM, nếu giá trị nhỏ hơn hoặc bằng giá trị tối đa hiện tại trong cột AUTO_INCREMENT, giá trị được đặt lại thành giá trị cột AUTO_INCREMENT tối đa hiện tại cộng với một.

Về bản chất, bạn chỉ có thể thay đổi AUTO_INCREMENT để tăng giá trị của cột tự động, không được đặt lại thành 1, như OP hỏi trong phần thứ hai của câu hỏi. Đối với các tùy chọn thực sự cho phép bạn đặt AUTO_INCREMENT xuống dưới mức tối đa hiện tại của nó, hãy xem Sắp xếp lại / đặt lại khóa chính tăng tự động .


20

Thêm một bản cập nhật vì chức năng đã thay đổi trong MySQL 5.6. Kể từ MySQL 5.6, bạn CÓ THỂ sử dụng ALTER TABLE đơn giản với InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Các tài liệu được cập nhật để phản ánh điều này:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

Thử nghiệm của tôi cũng cho thấy bảng KHÔNG được sao chép, giá trị được thay đổi đơn giản.


19

Có các tùy chọn tốt được đưa ra trong Cách đặt lại cột Autoincrement của MySQL

Lưu ý rằng ALTER TABLE tablename AUTO_INCREMENT = value;không không làm việc cho InnoDB


8
Bạn có làm thế nào để làm điều này với InnoDB?
EmptyArsenal

4
Hoạt động tốt với tôi khi sử dụng MySQL v 5.6.2
Eddie B

Tôi gặp vấn đề tương tự khi trường tự động không được đặt lại sau khi tôi xóa các bản ghi khỏi bảng. TRUNCATE dường như đã làm việc. Tôi nghĩ rằng các giải pháp dưới đây để loại bỏ tự động và sau đó áp dụng lại có thể giúp giảm bớt điều này.
Craig Maloney

@CraigMaloney - DELETE(hoặc ROLLBACK) sẽ không phục hồi id. Một ngoại lệ: Sau khi khởi động lại (hoặc sự cố), id tiếp theo được tính là MAX(id)+1, do đó phục hồi hiệu quả các id đã bị xóa ở cuối . Ngoại lệ: MySQL 8.0 khiến những id đó không được sử dụng.
Rick James

12
ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

Tôi đã sử dụng điều này trong một số tập lệnh của mình, trường id được thả xuống và sau đó được thêm lại với các cài đặt trước đó, tất cả các trường tồn tại trong bảng cơ sở dữ liệu được điền vào các giá trị gia tăng tự động mới, điều này cũng sẽ hoạt động với InnoDB.

Lưu ý rằng tất cả các trường trong bảng sẽ được kể lại và sẽ có các id khác !!!.


3
Tôi muốn có một cái gì đó như thế này! Nhưng như một cảnh báo thêm; điều này rõ ràng sẽ phá vỡ hoàn toàn các khóa ngoại của bạn.
NoobishPro

12

Bạn cũng có thể sử dụng TRUNCATEbảng cú pháp như thế này: TRUNCATE TABLE table_name

HÃY THỬ !! TRUNCATE TABLE your_tablesẽ xóa mọi thứ trong your_table!!


14
Lập trình viên mới , lưu ý rằng TRUNCATEcũng sẽ xóa TẤT CẢ các hàng của bạn trong bảng được chỉ định!
Zanshin13

1
Nhận xét trên nên được chèn vào câu trả lời, hoặc ít nhất là một lời giải thích về việc sử dụng cắt cụt thực tế.
Lucas Kauz

TRUNCATEcũng sẽ thiết lập lại các auto_incrementlĩnh vực? Trường hợp sử dụng của tôi là xóa dữ liệu trong bảng và khởi động lại ID từ 1 cho dữ liệu mới (hãy tưởng tượng, xóa bảng để sử dụng đúng sau khi hoàn tất kiểm tra). Tôi nghĩ rằng tôi phải đến DROPtoàn bộ bàn và CREATEnó một lần nữa.
ADTC

Có, TRUNCATE hoạt động giống như thiết lập lại trên bàn. Điều đó không hoàn toàn đúng nếu một bảng đã bị THAY ĐỔI kể từ khi tạo nó thì những thay đổi đó sẽ không được đặt lại. Tôi cho rằng nó gần hơn với việc xuất cấu trúc bảng và sử dụng xuất để tạo một bảng mới hơn là thiết lập lại thực tế.
Chris

Có @ADTC. Nếu bạn muốn giữauto_increment giá trị hiện tại , sử dụng DELETE FROMthay vì TRUNCATE.
TRiG

8

nó dành cho bàn trống:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

nếu bạn có dữ liệu nhưng bạn muốn thu dọn dữ liệu, tôi khuyên bạn nên sử dụng dữ liệu này:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);

sử dụng đơn giản
Abdul Aziz Al Basyir

Điều này làm việc cho chúng tôi với dữ liệu. Nó đặt lại hàng cho chỉ mục tiếp theo. Cảm ơn!
Dazzle

urwell @Dazzle!
Abdul Aziz Al Basyir

5

Đây là giải pháp của tôi, nhưng tôi sẽ không khuyên bạn làm điều này nếu cột của bạn có các ràng buộc hoặc được kết nối dưới dạng khóa ngoại với các bảng khác vì nó sẽ có tác động xấu hoặc thậm chí sẽ không hoạt động.

> Đầu tiên: thả cột

ALTER TABLE tbl_name DROP COLUMN column_id

> Thứ hai: tạo lại cột và đặt nó là FIRST nếu bạn muốn nó là cột đầu tiên tôi giả sử.

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

Điều này hoạt động tốt!


3

Kể từ MySQL 5.6, cách tiếp cận dưới đây hoạt động nhanh hơn do DDL trực tuyến (lưu ý algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


2

Bạn có thể chỉ cần cắt bớt bảng để thiết lập lại chuỗi

TRUNCATE TABLE TABLE_NAME

1

Tôi đã cố gắng thay đổi bảng và đặt auto_increment thành 1 nhưng nó không hoạt động. Tôi quyết tâm xóa tên cột tôi đang tăng, sau đó tạo một cột mới với tên ưa thích của bạn và đặt cột mới đó để tăng từ khi bắt đầu.


bạn có thể giải thích làm thế nào bạn thực hiện điều đó xảy ra?
MZaragoza

@MZaragoza Đơn giản chỉ cần bỏ cột cũ không có AI sau đó tạo cột mới có bật AI.
andromeda

Bạn có thể cập nhật câu trả lời của bạn để hiển thị điều này. Tôi thực sự sẽ đánh giá cao nó
MZaragoza

1

Bộ đếm tăng tự động cho một bảng có thể được đặt lại theo hai cách:

  1. Bằng cách thực hiện một truy vấn, giống như những người khác đã giải thích:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Sử dụng Workbench hoặc công cụ thiết kế cơ sở dữ liệu trực quan khác. Tôi sẽ trình bày trong Workbench cách nó được thực hiện - nhưng nó cũng không khác nhiều trong công cụ khác. Bằng cách nhấp chuột phải vào bảng mong muốn và chọn Alter tabletừ menu ngữ cảnh. Ở phía dưới, bạn có thể thấy tất cả các tùy chọn có sẵn để thay đổi bảng. Chọn Optionsvà bạn sẽ nhận được mẫu này: nhập mô tả hình ảnh ở đây

    Sau đó, chỉ cần đặt giá trị mong muốn trong trường Auto incrementnhư được hiển thị trong hình ảnh. Điều này về cơ bản sẽ thực hiện truy vấn được hiển thị trong tùy chọn đầu tiên.


0

Để cập nhật mới nhất cộng với một id

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);


0

Tôi googled và tìm thấy câu hỏi này, nhưng câu trả lời tôi thực sự đang tìm kiếm đáp ứng hai tiêu chí:

  1. sử dụng các truy vấn thuần túy của MySQL
  2. đặt lại mức tăng tự động của bảng hiện tại thành tối đa (id) + 1

Vì tôi không thể tìm thấy chính xác những gì tôi muốn ở đây, tôi đã thu thập câu trả lời từ nhiều câu trả lời khác nhau và chia sẻ nó ở đây.

Vài điều cần lưu ý:

  1. bảng trong câu hỏi là InnoDB
  2. bảng sử dụng trường idvới kiểu nhưint khóa chính
  3. cách duy nhất để làm điều này hoàn toàn trong MySQL là sử dụng thủ tục được lưu trữ
  4. hình ảnh của tôi dưới đây đang sử dụng SequelPro làm GUI. Bạn sẽ có thể điều chỉnh nó dựa trên trình soạn thảo MySQL ưa thích của bạn
  5. Tôi đã thử nghiệm điều này trên MySQL Ver 14,14 Distrib 5.5.61, cho debian-linux-gnu

Bước 1: Tạo thủ tục lưu trữ

tạo một thủ tục được lưu trữ như thế này:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc; 
      EXECUTE stmt; 
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt; 

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

Sau đó chạy nó.

Trước khi chạy, nó trông như thế này khi bạn xem phần Thủ tục lưu trữ trong cơ sở dữ liệu của bạn.

nhập mô tả hình ảnh ở đây

Khi tôi chạy, tôi chỉ cần chọn thủ tục được lưu trữ và nhấn Run Selection

nhập mô tả hình ảnh ở đây

Lưu ý: phần phân cách là rất quan trọng. Do đó nếu bạn sao chép và dán từ các câu trả lời được chọn hàng đầu trong câu hỏi này, chúng có xu hướng không hoạt động vì lý do này.

Sau khi tôi chạy, tôi sẽ thấy các thủ tục được lưu trữ

nhập mô tả hình ảnh ở đây

Nếu bạn cần thay đổi thủ tục được lưu trữ, bạn cần xóa thủ tục được lưu trữ, sau đó chọn để chạy lại.

Bước 2: Gọi thủ tục lưu trữ

Lần này bạn chỉ có thể sử dụng các truy vấn MySQL bình thường.

call reset_autoincrement('products');

Ban đầu từ các ghi chú truy vấn SQL của riêng tôi trong https://simkimsia.com/l Library / sql-query / # mysql- reset-autoinc và được điều chỉnh cho StackOverflow


0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

-1

Hãy thử chạy truy vấn này

 ALTER TABLE tablename AUTO_INCREMENT = value;

Hoặc Thử truy vấn này để đặt lại tự động tăng

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

Và đặt Tự động tăng sau đó chạy truy vấn này

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

-2

Tôi khuyên bạn nên truy cập Trình duyệt truy vấn và thực hiện các thao tác sau:

  1. Đi đến schemata và tìm bảng bạn muốn thay đổi.
  2. Nhấp chuột phải và chọn sao chép tạo tuyên bố.
  3. Mở một tab kết quả và dán câu lệnh tạo của chúng.
  4. Đi đến dòng cuối cùng của câu lệnh tạo và tìm Auto_Increment = N, (Trong đó N là số hiện tại cho trường auto_increment.)
  5. Thay N bằng 1.
  6. Nhấn ctrl+enter .

Auto_increment sẽ đặt lại thành một khi bạn nhập hàng mới vào bảng.

Tôi không biết điều gì sẽ xảy ra nếu bạn cố gắng thêm một hàng trong đó giá trị trường auto_increment đã tồn tại.

Hy vọng điều này giúp đỡ!


-2

Cách tốt nhất là xóa trường bằng AI và thêm lại trường đó bằng AI, hoạt động cho tất cả các bảng


1
hoàn toàn không phải là cách tốt nhất, bỏ một cột sẽ làm mất dữ liệu cột
Disha G Lòng tin
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.