Thay đổi số bắt đầu tăng tự động?


264

Trong MySQL, tôi có một bảng và tôi muốn đặt auto_incrementgiá trị 5thay vì 1. Điều này có thể không và câu lệnh truy vấn nào làm điều này?


bạn không thể THAY ĐỔI, chỉ tăng
Vasilii Suricov

1
You can change this option with ALTER TABLE, but in that case the new value must be higher than the highest value which is present in the AUTO_INCREMENT column. Nguồn @VasiliiSuricov Nếu không có giá trị cao hơn mức bạn muốn đặt auto_incrementcột ed, bạn cũng có thể giảm giá trị. ( tài liệu mysql )
seyfahni

Câu trả lời:


520

Bạn có thể sử dụng ALTER TABLEđể thay đổi giá trị ban đầu auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Xem tài liệu tham khảo MySQL để biết thêm chi tiết.


6
Bất cứ ai cũng biết nếu có thể làm mà KHÔNG CÓ THAY ĐỔI?
thesmart

3
Vâng nó có thể. Xem trả lời của tôi.
Cosimo

3
MySQL 5.6 có một lỗi không cho phép bạn giảm AUTO_INCREMENTgiá trị, nhưng nó đã được sửa trong 5.6.16 và 5.7.4, xem bug.mysql.com/orms.php?id=69882
Daniel Vandersluis

3
Hãy xem cảnh báo của cosimo về bảng được xây dựng lại nếu bạn làm điều này!
h00ligan

15
Để làm rõ: Đặt giá trị ban đầu thành 5, có nghĩa là lần chèn tiếp theo sẽ là 5.
Steen Schütt

97

Có, bạn có thể sử dụng ALTER TABLE t AUTO_INCREMENT = 42tuyên bố. Tuy nhiên, bạn cần lưu ý rằng điều này sẽ gây ra việc xây dựng lại toàn bộ bảng của bạn, ít nhất là với InnoDB và một số phiên bản MySQL nhất định. Nếu bạn có một bộ dữ liệu đã có sẵn với hàng triệu hàng, có thể mất một thời gian rất dài để hoàn thành .

Theo kinh nghiệm của tôi, tốt hơn là làm như sau:

BEGIN WORK;
-- You may also need to add other mandatory columns and values
INSERT INTO t (id) VALUES (42);
ROLLBACK;

Theo cách này, ngay cả khi bạn khôi phục giao dịch, MySQL sẽ giữ giá trị tăng tự động và thay đổi sẽ được áp dụng ngay lập tức.

Bạn có thể xác minh điều này bằng cách đưa ra một SHOW CREATE TABLE ttuyên bố. Bạn nên thấy:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...

5
CẢM ƠN! SET foreign_key_checks = 0;cũng hữu ích cho việc này.
dnozay

Ý tưởng tuyệt vời! Nitpick: SHOW CREATE TABLE tsẽ thực sự trở lại 43, tức là giá trị tiếp theo sau khi chèn 42.
petrkotek

2
@cosimo, Chờ đã, đây không phải là giấy tờ sao? Có phải hướng dẫn đã nói rằng nó nên hoạt động theo cách đó? Nếu không, nó có thể bị hỏng trong một thiết lập mysql (tương lai) khác.
Pacerier 3/2/2015

1
@Pacerier vâng, bạn đúng rồi. Điều này phụ thuộc vào cách thức hoạt động của MySQL hiện tại. Nó có thể không hoạt động như thế trong tương lai. Với lịch sử MySQL, tôi cho rằng nó sẽ tiếp tục hoạt động theo cách đó trong một thời gian dài.
Cosimo

@cosimo, Hy vọng họ sẽ ghi lại nó để mã đáng tin cậy thực sự có thể sử dụng bản hack tốt này. Cho đến bây giờ, mã muốn đáng tin cậy không thể sử dụng mã này.
Pacerier 8/2/2015

13

Cách tự động tăng thêm một, bắt đầu từ 10 trong MySQL:

create table foobar(
  id             INT PRIMARY KEY AUTO_INCREMENT,
  moobar         VARCHAR(500)
); 
ALTER TABLE foobar AUTO_INCREMENT=10;

INSERT INTO foobar(moobar) values ("abc");
INSERT INTO foobar(moobar) values ("def");
INSERT INTO foobar(moobar) values ("xyz");

select * from foobar;

'10', 'abc'
'11', 'def'
'12', 'xyz'

Tự động này tăng cột id lên một bắt đầu từ 10.

Tự động tăng trong MySQL lên 5, bắt đầu từ 10:

drop table foobar
create table foobar(
  id             INT PRIMARY KEY AUTO_INCREMENT,
  moobar         VARCHAR(500)
); 
SET @@auto_increment_increment=5;
ALTER TABLE foobar AUTO_INCREMENT=10;

INSERT INTO foobar(moobar) values ("abc");
INSERT INTO foobar(moobar) values ("def");
INSERT INTO foobar(moobar) values ("xyz");

select * from foobar;
'11', 'abc'
'16', 'def'
'21', 'xyz'

Điều này tự động tăng cột id lên 5 mỗi lần, bắt đầu từ 10.


5

Quy trình tự động sửa giá trị AUTO_INCREMENT của bảng

DROP PROCEDURE IF EXISTS update_auto_increment;
DELIMITER //
CREATE PROCEDURE update_auto_increment (_table VARCHAR(64))
BEGIN
    DECLARE _max_stmt VARCHAR(1024);
    DECLARE _stmt VARCHAR(1024);    
    SET @inc := 0;

    SET @MAX_SQL := CONCAT('SELECT IFNULL(MAX(`id`), 0) + 1 INTO @inc FROM ', _table);
    PREPARE _max_stmt FROM @MAX_SQL;
    EXECUTE _max_stmt;
    DEALLOCATE PREPARE _max_stmt;

    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', @inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END//
DELIMITER ;

CALL update_auto_increment('your_table_name')

3

Nếu bạn cần thủ tục này cho tên trường thay đổi thay vì idđiều này có thể hữu ích:

DROP PROCEDURE IF EXISTS update_auto_increment;
DELIMITER //
CREATE PROCEDURE update_auto_increment (_table VARCHAR(128), _fieldname VARCHAR(128))
BEGIN
    DECLARE _max_stmt VARCHAR(1024);
    DECLARE _stmt VARCHAR(1024);    
    SET @inc := 0;

    SET @MAX_SQL := CONCAT('SELECT IFNULL(MAX(',_fieldname,'), 0) + 1 INTO @inc FROM ', _table);
    PREPARE _max_stmt FROM @MAX_SQL;
    EXECUTE _max_stmt;
    DEALLOCATE PREPARE _max_stmt;

    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', @inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END //
DELIMITER ;

CALL update_auto_increment('your_table_name', 'autoincrement_fieldname');

2

Bạn cũng có thể làm điều đó bằng cách sử dụng phpmyadmin. Chỉ cần chọn bảng hơn là đi đến hành động. Và thay đổi gia tăng tự động bên dưới các tùy chọn bảng. Đừng quên bấm vào bắt đầu Tự động tăng trong phpmyadmin


-2

chỉ cần xuất bảng với dữ liệu .. sau đó sao chép sql của nó như

CREATE TABLE IF NOT EXISTS `employees` (
  `emp_badgenumber` int(20) NOT NULL AUTO_INCREMENT,
  `emp_fullname` varchar(100) NOT NULL,
  `emp_father_name` varchar(30) NOT NULL,
  `emp_mobile` varchar(20) DEFAULT NULL,
  `emp_cnic` varchar(20) DEFAULT NULL,
  `emp_gender` varchar(10) NOT NULL,
  `emp_is_deleted` tinyint(4) DEFAULT '0',
  `emp_registration_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `emp_overtime_allowed` tinyint(4) DEFAULT '1',
  PRIMARY KEY (`emp_badgenumber`),
  UNIQUE KEY `bagdenumber` (`emp_badgenumber`),
  KEY `emp_badgenumber` (`emp_badgenumber`),
  KEY `emp_badgenumber_2` (`emp_badgenumber`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=111121326 ;

bây giờ thay đổi giá trị gia tăng tự động và thực hiện sql.

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.