質問するログイン新規登録

回答編集履歴

1

last_insert_id\(\)関数について追記

2015/10/31 11:41

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

answer CHANGED
@@ -1,2 +1,77 @@
1
1
  オートインクリメントで実現できます。
2
- [https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html](https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html)
2
+ [https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html](https://dev.mysql.com/doc/refman/5.6/ja/example-auto-increment.html)
3
+
4
+ ---
5
+
6
+ ## last_insert_id()関数について
7
+
8
+ `last_insert_id()`関数に`FROM`句は不要です。
9
+
10
+ 公式のリファレンスによると、引数なしの`last_insert_id()`の戻り値は
11
+ > 最近実行された INSERT ステートメントの結果として、最初に自動的に生成され、正常に AUTO_INCREMENT カラムに挿入された値を表す 64 ビット値
12
+ だからです。
13
+ [https://dev.mysql.com/doc/refman/5.6/ja/information-functions.html#function_last-insert-id](https://dev.mysql.com/doc/refman/5.6/ja/information-functions.html#function_last-insert-id)
14
+
15
+ なにやら難しいことを言っていますが、要するに
16
+ 「最後に実行された`INSERT`文で挿入されたレコードのうち、
17
+   (レコードが複数ある場合は)最初に挿入されたレコードのオートインクリメント値」
18
+ が返却されるわけで、テーブルを指定することができないためです。
19
+ ```sql
20
+ mysql> CREATE TABLE sample1 (id INT PRIMARY KEY AUTO_INCREMENT);
21
+ Query OK, 0 rows affected (0.01 sec)
22
+
23
+ # sample2テーブルはオートインクリメントを11から開始
24
+ mysql> CREATE TABLE sample2 (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 11;
25
+ Query OK, 0 rows affected (0.01 sec)
26
+
27
+
28
+ mysql> INSERT INTO sample1 VALUES ();
29
+ Query OK, 1 row affected (0.01 sec)
30
+
31
+ mysql> INSERT INTO sample2 VALUES ();
32
+ Query OK, 1 row affected (0.00 sec)
33
+
34
+
35
+ # "FROM sample1"を付けても、返却されるのは最後にインサートしたsample2テーブルのオートインクリメント値
36
+ mysql> SELECT last_insert_id() FROM sample1;
37
+ +------------------+
38
+ | last_insert_id() |
39
+ +------------------+
40
+ | 11 |
41
+ +------------------+
42
+ 1 row in set (0.00 sec)
43
+
44
+ mysql> SELECT last_insert_id();
45
+ +------------------+
46
+ | last_insert_id() |
47
+ +------------------+
48
+ | 11 |
49
+ +------------------+
50
+ 1 row in set (0.00 sec)
51
+ ```
52
+
53
+ 加えて、`FROM`句を付けると、指定したテーブルに格納されているレコードの数だけ、結果セットの行が返ってしまいます。
54
+ ```sql
55
+ mysql> INSERT INTO sample1 VALUES (), (), ();
56
+ Query OK, 3 rows affected (0.00 sec)
57
+ Records: 3 Duplicates: 0 Warnings: 0
58
+
59
+ mysql> SELECT last_insert_id() FROM sample1;
60
+ +------------------+
61
+ | last_insert_id() |
62
+ +------------------+
63
+ | 2 |
64
+ | 2 |
65
+ | 2 |
66
+ | 2 |
67
+ +------------------+
68
+ 4 rows in set (0.00 sec)
69
+
70
+ mysql> SELECT last_insert_id();
71
+ +------------------+
72
+ | last_insert_id() |
73
+ +------------------+
74
+ | 2 |
75
+ +------------------+
76
+ 1 row in set (0.00 sec)
77
+ ```