AUTO_INCREMENT 属性を使用すると、新しい行に一意の識別子を生成できます。

CREATE TABLE animals (
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)

INSERT INTO animals (name) VALUES

SELECT * FROM animals;


| id | name    |
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |

AUTO_INCREMENT カラムには値が指定されなかったため、MySQL が自動的にシーケンス番号を割り当てました。カラムに明示的に 0 を割り当ててシーケンス番号を生成することもできます。カラムが NOT NULL と宣言されている場合は、NULL 割り当ててシーケンス番号を生成することもできます。

SQL 関数 LAST_INSERT_ID() または C API 関数 mysql_insert_id() を使用すると、最後に生成した AUTO_INCREMENT の値を取得できます。これらの関数は接続に固有の関数であるため、別の接続が同様に挿入を実行していても、戻り値は影響を受けません。

AUTO_INCREMENT カラムには、必要な最大のシーケンス値を保持するのに十分な大きさを持つ最小の整数データ型を使用します。カラムがデータ型の上限値に到達すると、次にシーケンス番号を生成しようとしたときには失敗します。可能であれば、より広い範囲を可能にするために UNSIGNED 属性を使用します。たとえば、TINYINT を使用する場合、許可される最大のシーケンス番号は 127 です。TINYINT UNSIGNED の場合は最大値は 255 です。すべての整数型の範囲は、セクション11.2.1「整数型 (真数値) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT」を参照してください。


複数行を同時に挿入する場合、LAST_INSERT_ID()mysql_insert_id() は、実際には最初に挿入した行の AUTO_INCREMENT キーを返します。これにより、レプリケーションセットアップで複数行の挿入を別のサーバーで正しく再現できます。

1 以外の AUTO_INCREMENT 値で開始するには、次のように、その値を CREATE TABLE または ALTER TABLE でセットします。


InnoDB の注意

InnoDB テーブルでは、一連の INSERT ステートメントの途中で自動インクリメント値を含むカラムを修正する場合は注意が必要です。たとえば、UPDATE ステートメントを使用して、自動インクリメントカラムに新しくより大きい値を入れると、後続の INSERT重複エラーになる場合があります。DELETE を実行したあとでさらに INSERT ステートメントが続く場合、またはトランザクションを COMMIT したが UPDATE ステートメントのあとではない場合に、自動インクリメント値がすでに存在するかどうかのテストが行われます。

MyISAM の注意

  • MyISAM テーブルには、マルチカラムインデックス内のセカンダリカラムに AUTO_INCREMENT を指定することができます。この場合、AUTO_INCREMENT カラムに生成される値は、MAX(auto_increment_column) + 1 WHERE prefix=given-prefix として計算されます。これは、データを順序付きのグループに分割する場合に便利です。

    CREATE TABLE animals (
        grp ENUM('fish','mammal','bird') NOT NULL,
        name CHAR(30) NOT NULL,
        PRIMARY KEY (grp,id)
    INSERT INTO animals (grp,name) VALUES
    SELECT * FROM animals ORDER BY grp,id;


    | grp    | id | name    |
    | fish   |  1 | lax     |
    | mammal |  1 | dog     |
    | mammal |  2 | cat     |
    | mammal |  3 | whale   |
    | bird   |  1 | penguin |
    | bird   |  2 | ostrich |

    この場合 (AUTO_INCREMENT カラムがマルチカラムインデックスの一部として使用されている場合)、グループ内で最大の AUTO_INCREMENT 値を持つ行を削除すると、そのグループで同じ AUTO_INCREMENT 値が再使用されることになります。これは、通常は AUTO_INCREMENT 値が再使用されることのない MyISAM テーブルの場合にも発生します。

  • AUTO_INCREMENT カラムが複合インデックスの一部である場合、MySQL は AUTO_INCREMENT カラムで始まるインデックスを使用してシーケンス値を生成します (ある場合)。たとえば、animals テーブルにインデックス PRIMARY KEY (grp, id)INDEX (id) が含まれている場合、MySQL はシーケンス値の生成で PRIMARY KEY を無視します。その結果、テーブルには grp 値ごとに 1 つのシーケンスではなく、単一のシーケンスが含まれることになります。


AUTO_INCREMENT に関する詳細の参照先を次に示します。

Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb
User Comments
  Posted by Guy Martin on June 19, 2003
For those that are looking to "reset" the auto_increment, say on a list that has had a few deletions and you want to renumber everything, you can do the following.

DROP the field you are auto_incrementing.
ALTER the table to ADD the field again with the same attributes.

You will notice that all existing rows are renumbered and the next auto_increment number will be equal to the row count plus 1.

(Keep in mind that DROPping that column will remove all existing data, so if you have exterior resources that rely on that data, or the numbers that are already there, you may break the link. Also, as with any major structure change, it's a good idea to backup your table BEFORE you make the change.)
  Posted by on June 22, 2003
In order to reset the auto_increment, in a situation where some of the most recently added rows were deleted, use:


and future insertions will be numbered from 1234 again (unless you still had rows numbered greater than 1234, and then the future insertions will start from the greatest number + 1 ).

  Posted by on October 23, 2003
The manual should probably make *better* mention of the fact that the order in which primary keys are specified determines the semantics by which a new value is selected. (Saying "... is calculated as MAX(auto_increment_column)+1) WHERE prefix=given-prefix." is unclear given that this is the first mention of the word "prefix" in the document.

For example,

create table location
id bigint not null auto_increment, -- "serial" per 4.1
longitude int,
latitude int,
place int,
primary key(id, longitude, latitude, place)

insert into location (longitude, latitude, place)
values (0,0,0), (1,1,1), (2,2,2);

select * from foo;
| id | longitude | latitude | place |
| 1 | 0 | 0 | 0 |
| 2 | 1 | 1 | 1 |
| 3 | 2 | 2 | 2 |

drop table location;

create table location
id bigint not null auto_increment, -- "serial" per 4.1
longitude int,
latitude int,
place int,
primary key(longitude, latitude, place, id)

insert into location (longitude, latitude, place)
values (0,0,0), (1,1,1), (2,2,2), (0,0,0);

select * from location order by id;
| id | longitude | latitude | place |
| 1 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 1 | 2 | 2 | 2 |
| 2 | 0 | 0 | 0 |

Unless I've misunderstood (please correct me if I'm wrong), it's a nice feature but should be better documented than it is.



  Posted by on November 8, 2004
Drop table command will also reset autoincrement
  Posted by nav on February 7, 2006
reset auto_increment using....

alter table "table_name" auto_increment=1
resets auto_increment to 1 + max(auto_increment)
  Posted by kernel panic on March 24, 2008
Another way to get the next Auto_increment value is using the information_schema:

SELECT Auto_increment FROM information_schema.tables WHERE table_name='the_table_you_want';
  Posted by Gabe Holmes on July 12, 2009
If you're using a phpmyadmin, go to the table in question and then Operations->Table Options->Auto-Increment
Set the auto-increment to whatever you please.

Remember to check any foreign keys before doing anything serious, brush your teeth every day and wear sunscreen at the beach.
  Posted by Lewis Graham on August 26, 2009
InnoDB resets the next auto_increment value to the highest value in the table + 1 after a server restart.
This means that if you delete the highest value(s) in the table, then restart you can get the same values for auto_increment again.
See: http://bugs.mysql.com/bug.php?id=727

  Posted by Luke Up on March 7, 2011
To reset auto_increment to 1, first make a backup of your table. I usually make 2 backups by copying my table 2 times (different names). Using one of the copies, delete the auto_increment field. Then run - ALTER TABLE `table_name` ADD `auto_increment_field` INT( 6 ) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( `auto_increment_field` ); If it works, Rename the original table to table_save and rename your modified table to the original table. Tested on phpmyadmin and mysql cli. Hope this helps.

  Posted by Daniel Bartley on June 29, 2011
-- Usage:
-- ResetTableIdentities('your_table_name');
-- Description:
-- Resets the Auto_Increment of the table [your_table_name] only when the number of rows in the [your_table_name] is equal to 0


CREATE DEFINER=`root`@`%` PROCEDURE `ResetTableIdentities`(IN table_name VARCHAR(64))
SET @returned_row_count = 0;
SET @table_name = table_name;

SET @statement = CONCAT("SELECT COUNT(*) INTO @returned_row_count FROM ", @table_name, ";");
PREPARE stmt FROM @statement;

IF (@returned_row_count = 0) THEN
SET @statement2 = CONCAT("ALTER TABLE ", @table_name, " AUTO_INCREMENT = 1;");
PREPARE stmt2 FROM @statement2;
EXECUTE stmt2;

  Posted by Sohail Khurshid on August 8, 2011
What's the point of mentioning such huge 'workarounds' when the auto_increment reset issue can be resolved simply by: "alter table "table_name" auto_increment=1" (as a couple of other people suggested too)?
  Posted by Thomas Mayer on January 20, 2012
As InnoDb forgets its highest auto_increment after server restart, you can set it again, if you have stored it anywhere. This happens often if you archive your data in an archive table and then delete it and then restart mysql. When archiving again this will result in duplicate key entries.

To work around this you can create a trigger which makes sure your auto_increment is higher than the auto_increment of your archive table:

delimiter //
drop trigger if exists trigger_autoinc_tbl;
CREATE TRIGGER trigger_autoinc_tbl BEFORE INSERT ON tbl
declare auto_incr1 BIGINT;
declare auto_incr2 BIGINT;
SELECT AUTO_INCREMENT INTO auto_incr1 FROM information_schema.TABLES WHERE table_schema=DATABASE() AND table_name='tbl';
SELECT AUTO_INCREMENT INTO auto_incr2 FROM information_schema.TABLES WHERE table_schema=DATABASE() AND table_name='tbl_archiv';
IF (auto_incr2 > auto_incr1 and NEW.id<auto_incr2) THEN
SET NEW.id = auto_incr2;
delimiter ;

Further reading: http://www.slicewise.net/index.php?id=82
  Posted by Anil Purushothaman on October 10, 2012
When using MySQL Workbench, you can reset the auto increment to 1 as follows -
Step 1 : In SQL Editor window, right click on the table name containing the auto increment field and select "Alter Table..."
Step 2 : Select "options" table in the alter table window pane.
Step 3 : The Auto Increment field here shows the current value that it has reached. Simply change it to the value you want (1 in this case).
Step 4 : Apply and close.
  Posted by Asromi rOmi on October 3, 2014
Try this one ..

Alter Table [TableName] add [newColoum] int auto_increment primary key;

it will add one coloum in the table as auto_increment.


desc [TableName];
  Posted by Charles Peterson on November 14, 2014
Note on finding all the tables with auto increment columns....

Sign Up Login You must be logged in to post a comment.