MySQLのSERIALにはNOT NULLがすでに含まれている?SERIALの正しい使い方と注意点
MySQLにおいて、SERIALは「BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE」のエイリアス(別名)として定義されています。つまり、SERIALを指定した時点で、自動的にNOT NULL制約が含まれるため、SERIALの後にNOT NULLを重ねて指定する必要はありません。
SERIALの定義内容
SERIALを1つのカラムに指定すると、以下の属性がすべて適用されます。
- BIGINT UNSIGNED:符号なし8バイト整数(0〜18,446,744,073,709,551,615)
- NOT NULL:NULL値を許可しない
- AUTO_INCREMENT:値を自動的に採番
- UNIQUE:重複する値を許可しない
実際にテーブルを作成してみる
それでは、例を見ながら確認していきましょう。ここでは、「Id」というSERIAL型のカラムを持つテーブルを作成します。
mysql> create table DemoTable
(
Id serial
);
Query OK, 0 rows affected (0.42 sec)レコードを挿入する
次に、INSERT文を使ってレコードを追加します。ポイントは、値を明示的に指定していない点です。AUTO_INCREMENTの働きにより、Idカラムには自動的に連番が採番されます。
mysql> insert into DemoTable values(); Query OK, 1 row affected (0.24 sec) mysql> insert into DemoTable values(); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(); Query OK, 1 row affected (0.06 sec) mysql> insert into DemoTable values(); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(); Query OK, 1 row affected (0.07 sec)
登録されたデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、以下のような出力が得られます。
+----+ | Id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +----+ 6 rows in set (0.00 sec)
まとめ
SERIALを使用すれば、BIGINT UNSIGNED・NOT NULL・AUTO_INCREMENT・UNIQUEのすべてが一度に適用されるため、主キー向けの連番カラムを簡潔に定義できます。ただし、NOT NULLがすでに含まれているため、Id serial NOT NULLのように重複して指定するのは避けましょう。なお、SERIALを主キーとして使いたい場合は、PRIMARY KEY(Id)を別途指定する必要がある点にも注意してください。
-
MySQLのNOT NULL制約とは?空にできない列の定義方法とエラーの挙動を解説
MySQLでは、列にNULL(空の値)を許可したくない場合、テーブル定義時にNOT NULL制約を指定します。NOT NULLが設定された列にNULLを挿入しようとすると、MySQLはエラーを返し、データの登録を拒否します。NOT NULL制約を持つテーブルの作成まず、Id列とLastName列をNOT NULLとして指定したテーブルを作成してみましょう。mysql> create table DemoTable1895 ( Id int NOT NULL, FirstName varchar(20), LastName varchar(20) NOT N
-
MySQLの既存のカラムにNOT NULL制約を設定する方法
MySQLですでに存在するカラムにNOT NULL制約を追加するには、ALTER TABLE文を使用します。この記事では、実際のSQL例を使いながら、NOT NULL制約の設定方法とその動作確認の手順をわかりやすく解説します。 1. テーブルの作成 まず、検証用のサンプルテーブルを作成します。 mysql> create table DemoTable1949 ( UserId int, UserName varchar(20) ); Query OK, 0 rows affected (0.00 sec) この時点では、UserNameカラムにはNUL