回答編集履歴

1

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

2015/10/31 11:41

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -1,3 +1,153 @@
1
1
  オートインクリメントで実現できます。
2
2
 
3
3
  [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)
4
+
5
+
6
+
7
+ ---
8
+
9
+
10
+
11
+ ## last_insert_id()関数について
12
+
13
+
14
+
15
+ `last_insert_id()`関数に`FROM`句は不要です。
16
+
17
+
18
+
19
+ 公式のリファレンスによると、引数なしの`last_insert_id()`の戻り値は
20
+
21
+ > 最近実行された INSERT ステートメントの結果として、最初に自動的に生成され、正常に AUTO_INCREMENT カラムに挿入された値を表す 64 ビット値
22
+
23
+ だからです。
24
+
25
+ [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)
26
+
27
+
28
+
29
+ なにやら難しいことを言っていますが、要するに
30
+
31
+ 「最後に実行された`INSERT`文で挿入されたレコードのうち、
32
+
33
+   (レコードが複数ある場合は)最初に挿入されたレコードのオートインクリメント値」
34
+
35
+ が返却されるわけで、テーブルを指定することができないためです。
36
+
37
+ ```sql
38
+
39
+ mysql> CREATE TABLE sample1 (id INT PRIMARY KEY AUTO_INCREMENT);
40
+
41
+ Query OK, 0 rows affected (0.01 sec)
42
+
43
+
44
+
45
+ # sample2テーブルはオートインクリメントを11から開始
46
+
47
+ mysql> CREATE TABLE sample2 (id INT PRIMARY KEY AUTO_INCREMENT) AUTO_INCREMENT = 11;
48
+
49
+ Query OK, 0 rows affected (0.01 sec)
50
+
51
+
52
+
53
+
54
+
55
+ mysql> INSERT INTO sample1 VALUES ();
56
+
57
+ Query OK, 1 row affected (0.01 sec)
58
+
59
+
60
+
61
+ mysql> INSERT INTO sample2 VALUES ();
62
+
63
+ Query OK, 1 row affected (0.00 sec)
64
+
65
+
66
+
67
+
68
+
69
+ # "FROM sample1"を付けても、返却されるのは最後にインサートしたsample2テーブルのオートインクリメント値
70
+
71
+ mysql> SELECT last_insert_id() FROM sample1;
72
+
73
+ +------------------+
74
+
75
+ | last_insert_id() |
76
+
77
+ +------------------+
78
+
79
+ | 11 |
80
+
81
+ +------------------+
82
+
83
+ 1 row in set (0.00 sec)
84
+
85
+
86
+
87
+ mysql> SELECT last_insert_id();
88
+
89
+ +------------------+
90
+
91
+ | last_insert_id() |
92
+
93
+ +------------------+
94
+
95
+ | 11 |
96
+
97
+ +------------------+
98
+
99
+ 1 row in set (0.00 sec)
100
+
101
+ ```
102
+
103
+
104
+
105
+ 加えて、`FROM`句を付けると、指定したテーブルに格納されているレコードの数だけ、結果セットの行が返ってしまいます。
106
+
107
+ ```sql
108
+
109
+ mysql> INSERT INTO sample1 VALUES (), (), ();
110
+
111
+ Query OK, 3 rows affected (0.00 sec)
112
+
113
+ Records: 3 Duplicates: 0 Warnings: 0
114
+
115
+
116
+
117
+ mysql> SELECT last_insert_id() FROM sample1;
118
+
119
+ +------------------+
120
+
121
+ | last_insert_id() |
122
+
123
+ +------------------+
124
+
125
+ | 2 |
126
+
127
+ | 2 |
128
+
129
+ | 2 |
130
+
131
+ | 2 |
132
+
133
+ +------------------+
134
+
135
+ 4 rows in set (0.00 sec)
136
+
137
+
138
+
139
+ mysql> SELECT last_insert_id();
140
+
141
+ +------------------+
142
+
143
+ | last_insert_id() |
144
+
145
+ +------------------+
146
+
147
+ | 2 |
148
+
149
+ +------------------+
150
+
151
+ 1 row in set (0.00 sec)
152
+
153
+ ```