LoginSignup
14
17

More than 5 years have passed since last update.

LAST_INSERT_ID()はauto_incrementedでなくてもいいしINSERTじゃなくてもいい

Posted at

MySQLにLAST_INSERT_ID()という関数があります。auto_incrementedのフィールドがあって、そこにレコードが追加された時に、最後に追加されたidを取得するというものです。

ですが、LAST_INSERT_ID()には引数を渡すことができて、その結果をUPDATEに渡すと、「最後にUPDATEした数値」を取得することができます。

こんな感じ

-- 準備
CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
-- 採番
UPDATE sequence SET id=LAST_INSERT_ID(id+1);
SELECT LAST_INSERT_ID();

まず、idというフィールドだけのテーブルを作り、1件だけレコードをINSERTしておきます。auto_incrementedでなくてもいいです。

採番時には、idをインクリメントしてUPDATEします。その際にLAST_INSERT_ID関数を経由してUPDATEします。同一セッションであれば、トランザクションで囲まなくても、先ほどUPDATEしたIDを取得することができています。INSERTじゃないので、レコードは1件のままです。

似たことは、トランザクションを区切ってやったりロックかけたりしてできないくはないのですが、こちらの方がデッドロックの心配もなく、ロジックはシンプルなのでおすすめです。

14
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
17