自動インクリメントの開始番号を変更しますか?


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. ソースauto_increment ed列に設定する値よりも高い値がない場合は、値を減らすこともできます。(mysqlドキュメント
seyfahni

回答:


520

を使用ALTER TABLEして、auto_incrementの初期値を変更できます。

ALTER TABLE tbl AUTO_INCREMENT = 5;

詳細については、MySQLリファレンスをご覧ください。


6
誰もがALTERなしで行うことが可能かどうか知っていますか?
thesmart

3
はい、可能です。私の返事を見てください。
Cosimo

3
MySQL 5.6には、AUTO_INCREMENT値を減らすことができないバグがありましたが、5.6.16および5.7.4で修正されています。bugs.mysql.com/ bug.php?id
Daniel Vandersluis

3
これを行うと、テーブルが再構築されるというcosimoの警告を確認してください!
h00ligan 2014

15
明確にする:5に初期値を設定し、手段は次のインサートが5になること
スティーン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 2013年

素晴らしいアイデア!Nitpick:SHOW CREATE TABLE t実際に43、つまりを挿入し42た後の次の値を返します。
petrkotek 2014年

2
@cosimo、待って、これは文書化されていませんか?マニュアルはそのように機能するはずだと言っていましたか?そうでない場合、別の(将来の)mysql設定で中断する可能性があります。
Pacerier、2015

1
@Pacerierはい、あなたは正しいです。これは、MySQLの現在の動作に依存しています。将来はそのように機能しない可能性があります。しかし、MySQLの歴史を考えると、長い間そのように機能し続けると思います。
Cosimo

@cosimo、うまくいけば、信頼できるコードがこの優れたハックを実際に使用できるように文書化します。現在のところ、信頼できるコードはこれを使用できません。
Pacerier 2015

13

MySQLで10から始めて、1ずつ自動インクリメントする方法:

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から1つずつ増加します。

MySQLの10から始まる5の自動インクリメント:

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カラムが10から始まり、毎回5ずつ増加します。


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を次のようにコピーします。

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.