เปลี่ยนหมายเลขเริ่มต้นการเพิ่มอัตโนมัติหรือไม่


264

ใน MySQL ผมมีตารางและฉันต้องการที่จะตั้งauto_incrementค่าให้กับแทน5 1สิ่งนี้เป็นไปได้หรือไม่และข้อความค้นหานี้ทำอะไร


คุณไม่สามารถเปลี่ยนเพิ่มได้เท่านั้น
Vasilii Suricov

1
@VasiliiSuricov 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. sourceหากไม่มีค่าสูงกว่าสิ่งที่คุณต้องการตั้งค่าauto_incrementคอลัมน์ ed ของคุณคุณยังสามารถลดค่าได้ ( เอกสาร mysql )
seyfahni

คำตอบ:


520

คุณสามารถใช้ALTER TABLEเพื่อเปลี่ยนค่าเริ่มต้น auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

ดูการอ้างอิง MySQLสำหรับรายละเอียดเพิ่มเติม


6
ใครรู้ว่ามันเป็นไปได้ที่จะทำโดยไม่มีการเปลี่ยนแปลง?
thesmart

3
ใช่มันเป็นไปได้ ดูคำตอบของฉัน
Cosimo

3
MySQL 5.6 มีข้อผิดพลาดที่ไม่อนุญาตให้คุณลดAUTO_INCREMENTค่า แต่ได้รับการแก้ไขใน 5.6.16 และ 5.7.4 ดูที่bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis

3
ดูคำเตือนของ cosimo เกี่ยวกับการสร้างตารางหากคุณทำเช่นนี้!
h00ligan

15
ในการชี้แจง: การตั้งค่าเริ่มต้นเป็น 5 หมายความว่าการแทรกครั้งต่อไปจะเป็น 5
Steen Schütt

97

ใช่คุณสามารถใช้ALTER TABLE t AUTO_INCREMENT = 42คำสั่ง อย่างไรก็ตามคุณต้องระวังว่าสิ่งนี้จะทำให้เกิดการสร้างตารางขึ้นใหม่ทั้งหมดอย่างน้อยก็ด้วย InnoDB และ MySQL บางเวอร์ชัน หากคุณมีชุดข้อมูลที่มีอยู่แล้วมีนับล้านของแถวมันอาจจะใช้เวลานานมากในการที่สมบูรณ์

จากประสบการณ์ของฉันดีกว่าที่จะทำต่อไปนี้:

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

ด้วยวิธีนี้แม้ว่าคุณจะย้อนกลับธุรกรรม แต่ MySQL จะรักษามูลค่าการเพิ่มโดยอัตโนมัติและการเปลี่ยนแปลงจะถูกนำไปใช้ทันที

คุณสามารถตรวจสอบได้โดยการออกSHOW CREATE TABLE tคำสั่ง คุณควรเห็น:

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

5
ขอขอบคุณ! SET foreign_key_checks = 0;ยังมีประโยชน์สำหรับสิ่งนี้
dnozay

ความคิดหลักแหลม! nitpick: SHOW CREATE TABLE tจริงจะกลับมาคือค่าถัดไปหลังจากใส่43 42
petrkotek

2
@cosimo รอนี่ไม่ใช่เอกสารหรือ คู่มือบอกว่าควรจะทำอย่างนั้น? ถ้าไม่มันอาจแตกในการตั้งค่า mysql (ในอนาคต) ที่แตกต่างกัน
Pacerier

1
@Pierier ใช่คุณถูกต้อง นี่ขึ้นอยู่กับวิธีการทำงานของ MySQL ในปัจจุบัน มันอาจไม่ทำงานอย่างนั้นในอนาคต จากประวัติของ MySQL ฉันคิดว่ามันจะทำงานต่อไปอีกนาน
Cosimo

@cosimo หวังว่าพวกเขาจะทำเอกสารเพื่อให้รหัสที่เชื่อถือได้จริงสามารถใช้แฮ็คที่ดีนี้ได้ ณ ตอนนี้รหัสที่ต้องการความน่าเชื่อถือไม่สามารถใช้งานได้
Pacerier

13

วิธีเพิ่มอัตโนมัติทีละหนึ่งเริ่มต้นที่ 10 ใน 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'

สิ่งนี้จะเพิ่มคอลัมน์ id โดยอัตโนมัติโดยเริ่มต้นที่ 10

เพิ่มอัตโนมัติใน MySQL ทีละ 5 เริ่มต้นที่ 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'

ซึ่งจะเพิ่มคอลัมน์ id อัตโนมัติ 5 ครั้งในแต่ละครั้งโดยเริ่มที่ 10


5

ขั้นตอนการแก้ไขค่า AUTO_INCREMENT ของตารางโดยอัตโนมัติ

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

หากคุณต้องการโพรซีเดอร์นี้สำหรับชื่อฟิลด์แบบผันแปรแทนที่จะเป็นแบบidนี้อาจเป็นประโยชน์:

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

คุณสามารถทำได้โดยใช้ phpmyadmin เพียงเลือกตารางมากกว่าไปสู่การทำงาน และเปลี่ยนการเพิ่มอัตโนมัติใต้ตัวเลือกตาราง อย่าลืมคลิกที่เริ่มต้น เพิ่มขึ้นอัตโนมัติใน phpmyadmin


-2

เพียงส่งออกตารางด้วยข้อมูล .. จากนั้นก็คัดลอก sql like

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 ;

ตอนนี้เปลี่ยนค่าเพิ่มอัตโนมัติและดำเนินการ sql

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.