MySQLのAUTO_INCREMENTとは?自動採番と初期値の設定方法をわかりやすく解説
AUTO_INCREMENT属性の基本
MySQLのAUTO_INCREMENT属性は、新しい行に対して一意の識別子(連番)を自動的に生成するために使用されます。カラムが「NOT NULL」として宣言されている場合、そのカラムにNULLを代入することで、連番のシーケンスを生成することが可能です。
AUTO_INCREMENTカラムに任意の値を挿入すると、そのカラムは指定した値に設定され、同時にシーケンスもリセットされます。以降は、挿入された最大値を起点として、連続した値が自動的に生成されていきます。
また、既存のAUTO_INCREMENTカラムを更新した場合も、AUTO_INCREMENTのシーケンスはリセットされます。直近に自動生成されたAUTO_INCREMENTの値は、SQLでは「LAST_INSERT_ID()」関数、C APIでは「mysql_insert_id()」関数を使用して取得できます。
これらの関数は接続ごとに独立しているため、戻り値が他の接続によるINSERT操作の影響を受けることはありません。なお、AUTO_INCREMENTカラムには、ユーザーが必要とする最大の連番値を格納できる範囲内で、なるべく小さい整数型を選択することが推奨されます。
AUTO_INCREMENTを使用する際のルール
AUTO_INCREMENT属性を使用する際は、以下のルールに従う必要があります。
- 1つのテーブルに設定できるAUTO_INCREMENTカラムは1つだけであり、通常は整数型である必要があります。
- AUTO_INCREMENTカラムにはインデックスが必要です。PRIMARY KEYまたはUNIQUEインデックスのいずれかである必要があります。
- AUTO_INCREMENTカラムにはNOT NULL制約が必要です。
- カラムにAUTO_INCREMENT属性を設定すると、MySQLが自動的にNOT NULL制約を付与します。
テーブル作成時の設定例
新しくテーブルを作成する場合は、以下のようにAUTO_INCREMENTを指定します。
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
PRIMARY KEY (id)
);既存テーブルへのAUTO_INCREMENTの設定方法
テーブルにまだidカラムが存在しない場合は、以下のステートメントを使用します。
ALTER TABLE tableName ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (id);一方、idカラムがすでに存在している場合は、以下のコマンドでAUTO_INCREMENTの初期値を変更できます。
ALTER TABLE tableName AUTO_INCREMENT=specificValue;ここで、「tableName」はAUTO_INCREMENTを設定したいテーブル名を指し、「specificValue」には連番の開始値となる任意の整数を指定します。この設定により、次に挿入される行から指定した値を起点とした連番が自動的に割り振られます。
-
MySQLでタイムスタンプ列に基づいてデータを選択し、真偽値を設定する方法
MySQLでタイムスタンプ列に基づいてデータを選択し、真偽値を設定する方法 MySQLではIF()関数を使うことで、タイムスタンプ列の値に基づいてデータを選択し、結果を真偽値(1または0)として取得できます。この記事では、実際のサンプルコードを交えながら手順を詳しく解説します。 まず、現在の日付を確認しておきましょう。 mysql> select curdate(); +------------+ | curdate() | +------------+ | 2019-12-10 | +------------+ 1 row in set (0.00 sec) テーブルの作成 はじめに
-
MySQLで列の値の先頭に000(ゼロ埋め)を追加する方法
MySQLで列の値に000(ゼロ)を追加するには?MySQLで数値の先頭に「000」のようなゼロを追加して表示したい場合は、ZEROFILL属性を使用します。ZEROFILLを指定した列では、設定された表示幅に満たない桁数が自動的に0で埋められます。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1913 ( Code int(4) ZEROFILL AUTO_INCREMENT NOT NULL, PRIMARY KEY(Code) ); Query OK, 0 rows affected (0.00