0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

こんにちは。
MySQLには、整数型のカラムで自動採番を行うことのできる AUTO_INCREMENT という属性があります。
AUTO_INCREMENT にNULLや0を指定したり、値を明示的に入れたりした場合、挙動はどうなるのでしょうか?
この記事では、AUTO_INCREMENT の基本的な挙動について調べたことをまとめます。

実行環境

  • MySQL 8.0.46

AUTO_INCREMENTとは

AUTO_INCREMENT は、整数型のカラムに自動で連番を割り当てるための属性です。
主キーのIDカラムで使われることがほとんどです。

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL
);

値を指定しないと自動採番される

id を指定せずにINSERTすると、MySQLが自動で値を割り当てます。

INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Carol');

SELECT * FROM users;
+----+-------+
| id | name  |
+----+-------+
|  1 | Alice |
|  2 | Bob   |
|  3 | Carol |
+----+-------+

NULLを入れても自動採番される

AUTO_INCREMENT カラムにNULLを指定した場合も、自動採番されます。

INSERT INTO users (id, name) VALUES (NULL, 'Dave');

SELECT * FROM users WHERE name = 'Dave';
+----+------+
| id | name |
+----+------+
|  4 | Dave |
+----+------+

NULLを入れたのに4が割り当てられています。

0を入れた場合はSQLモードに依存する

0を入れた場合の挙動は、SQLモードによって変わります。
デフォルトでは、0を指定してもNULLと同様に自動採番されます。
0という値をそのまま保存したい場合は、NO_AUTO_VALUE_ON_ZERO モードを有効にする必要があります。

現在のグローバル、またはセッションのSQLモードは次のクエリで確認できます。

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

グローバル、またはセッションで NO_AUTO_VALUE_ON_ZERO を有効にするには、次のように設定します。

SET GLOBAL sql_mode = CONCAT(@@GLOBAL.sql_mode, ',NO_AUTO_VALUE_ON_ZERO');
SET SESSION sql_mode = CONCAT(@@SESSION.sql_mode, ',NO_AUTO_VALUE_ON_ZERO');

明示的に値を入れると採番に影響する

AUTO_INCREMENT カラムには、明示的に値を指定することもできます。

INSERT INTO users (id, name) VALUES (100, 'Eve');

INSERT INTO users (name) VALUES ('Frank');

SELECT * FROM users WHERE name IN ('Eve', 'Frank');
+-----+-------+
| id  | name  |
+-----+-------+
| 100 | Eve   |
| 101 | Frank |
+-----+-------+

100を手動で入れると、次の自動採番は101になりました。
AUTO_INCREMENT は、カラムの現在の最大値をもとに次の値を決めます。

LAST_INSERT_ID() で採番された値を確認できる

直前に自動生成された値は、LAST_INSERT_ID() で取得できます。

INSERT INTO users (name) VALUES ('Grace');

SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|              102 |
+------------------+

この値は接続(セッション)ごとに管理されます。
他のクライアントが同時にINSERTしても、自分の LAST_INSERT_ID() には影響しません。

複数行を1回のINSERTで入れた場合は、最初に生成された値が返ります。

INSERT INTO users (name) VALUES ('Heidi'), ('Ivan');

SELECT LAST_INSERT_ID(); -- 103(最初の行のID)

まとめ

  • AUTO_INCREMENT は整数カラムに自動で連番を割り当てる属性
  • 値を省略した場合、NULLを指定した場合に自動採番される
  • 0を指定した場合の挙動はSQLモード(NO_AUTO_VALUE_ON_ZERO)に依存する
  • 明示的に大きな値を入れると、採番に影響が出る
  • LAST_INSERT_ID() で直前の採番値を確認できる

お読みいただきありがとうございました。

参考文献

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?