MySQL 5.6 リファレンスマニュアル  /  ...  /  最後に挿入された行の一意の ID を取得する方法 最後に挿入された行の一意の ID を取得する方法

AUTO_INCREMENT カラムを含むテーブルにレコードを挿入する場合、mysql_insert_id() 関数を呼び出すことによって、そのカラム内に格納された値を取得できます。

C アプリケーションから、次のコード (ステートメントが成功したことをチェックしているものとみなす) を実行することによって、値が AUTO_INCREMENT カラム内に格納されたかどうかをチェックできます。それは、クエリーが AUTO_INCREMENT インデックスによる INSERT であったかどうかを判断します。

if ((result = mysql_store_result(&mysql)) == 0 &&
    mysql_field_count(&mysql) == 0 &&
    mysql_insert_id(&mysql) != 0)
    used_id = mysql_insert_id(&mysql);

新しい AUTO_INCREMENT 値が生成されたら、mysql_query() で、SELECT LAST_INSERT_ID() ステートメントを実行し、ステートメントによって返された結果セットから値を取得することによって、それを取得することもできます。


LAST_INSERT_ID() では、最近生成された ID が接続ごとにサーバーに維持されます。それはほかのクライアントによって変更されません。別の AUTO_INCREMENT カラムを非マジック値 (つまり、NULL でなく、0 でない値) で更新した場合でも、それは変更されません。LAST_INSERT_ID() カラムと AUTO_INCREMENT カラムを複数のクライアントから同時に使うことは完全に有効です。各クライアントは、そのクライアントが実行した最後のステートメントの最後に挿入された ID を受け取ります。

1 つのテーブルに生成された ID を使用して、それを 2 番目のテーブルに挿入する場合、このような SQL ステートメントを使うことができます。

INSERT INTO foo (auto,text)
    VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table

mysql_insert_id()AUTO_INCREMENT カラムに格納された値が、NULL または 0 を格納することによって自動的に生成されているか、または明示的な値として指定されたかどうかに関係なく、その値を返します。LAST_INSERT_ID() は自動的に生成された AUTO_INCREMENT 値のみを返します。NULL または 0 以外の明示的な値を格納する場合、それは、LAST_INSERT_ID() によって返される値に影響を与えません。

AUTO_INCREMENT カラム内の最後の ID を取得する詳細については:

Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb
User Comments
  Posted by Anthony Eden on August 19, 2005
If you want store the last id for use in multiple insert statements:

create table person (
id bigint not null primary key auto_increment,
name char(100) not null
insert into person set name = 'Joe';
select @id:=id as id from class where id = last_insert_id();
insert into some_other_table set person_id = @class_id;
insert into yet_another_table set person_id = @class_id;
  Posted by Matt Lavallee on October 2, 2005
It's worth noting that LAST_INSERT_ID() does not work through connectors if the "Use Concurrent Inserts" is enabled in MyISAM.

I spent a dizzying amount of time troubleshooting to find that out.
  Posted by Russell Levy on March 3, 2006
LAST_INSERT_ID() will return the first id from a multi row insert. For example,

create table person (
id bigint not null primary key auto_increment,
name char(100) not null

INSERT INTO person (name) VALUES ('first'), ('second');
will return 1, not 2.
  Posted by Joey Yew Joe on January 30, 2007
for the benefit of mankind.. please refer to the following..

keywords : how to get index after insert, select @@identity from mysql, mysql_insert_id() in sql, mysql_insert_id() in java, jsp, mysql_last_id()
  Posted by J Walker on February 14, 2007
The only safe way I've discovered to establish the proper value for an INSERT . . . SELECT "from/to the same table" is:

SELECT id FROM aircraft_main ORDER BY id DESC LIMIT 1;

add one (1) to that AUTO_INCREMENT id value.

do your INSERT . . . SELECT using a literal for the AUTO_INCREMENT field and list all the other data fields - twice.


  Posted by Lewis Roberts on February 26, 2010
I'm in the middle of developing a database for a small online shop that has products with many options and many option values (bespoke blinds) so this will no doubt come in handy when I actually get the to the point of building the procedures and transactions. Glad I found it!

Two ways of storing the last auto_increment value as a user variable.

SET @lastid = LAST_INSERT_ID();
SELECT @lastid2 := LAST_INSERT_ID();

As mentioned in previous comments, although it is of course possible to do multiple inserts in one hit, it's perhaps safer for data integrity to be generous with your SQL INSERTs. Obviously this increases load but I'd rather know my data was correct and put another 16GB of memory in my server than deal with the alternative.
Sign Up Login You must be logged in to post a comment.