MySQLにおけるSERIALとAUTO_INCREMENTの違いとは?
MySQLでは、SERIALとAUTO_INCREMENTはどちらもフィールドのデフォルト値として連番(シーケンス)を自動生成するために使われますが、両者は技術的には異なるものです。それぞれの特徴と違いを、実際の実行例とともに解説します。
AUTO_INCREMENTの特徴
AUTO_INCREMENT属性は、BIT型とDECIMAL型を除くすべての数値データ型で利用できます。ただし、1つのテーブルに設定できるAUTO_INCREMENT列は1つだけであり、あるテーブルで生成されたシーケンスを他のテーブルで使い回すことはできません。
また、この属性を使用するには対象の列にUNIQUEインデックスが必要です。これにより、生成される番号に重複がないことが保証されます。シーケンスはデフォルトで1から始まり、行を挿入するたびに1ずつ増加していきます。
実行例
mysql> CREATE TABLE Student(Student_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, Name VARCHAR(20));
Query OK, 0 rows affected (0.18 sec)
上記のクエリでは、Student_id列をAUTO_INCREMENTとして宣言しています。
mysql> INSERT INTO Student(Name) VALUES('RAM'),('SHYAM');
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM Student;
+------------+-------+
| Student_id | Name |
+------------+-------+
| 1 | RAM |
| 2 | SHYAM |
+------------+-------+
2 rows in set (0.00 sec)
mysql> SHOW CREATE TABLE Student\G
*************************** 1. row ***************************
Table: Student
Create Table: CREATE TABLE `student` (
`Student_id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`Student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)SERIALの特徴
一方、SERIALは「BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE」のエイリアスであり、SERIAL DEFAULT VALUEは「NOT NULL AUTO_INCREMENT UNIQUE KEY」の省略形にあたります。つまり、SERIALを指定するだけで、符号なしBIGINT型による自動採番と一意制約がまとめて適用されます。なお、SERIAL DEFAULT VALUEキーワードは、TINYINT、SMALLINT、MEDIUMINT、INT、BIGINTといった整数型でサポートされています。
実行例
mysql> CREATE TABLE Student_serial(Student_id SERIAL, Name VARCHAR(20));
Query OK, 0 rows affected (0.17 sec)
mysql> INSERT INTO Student_serial(Name) VALUES('RAM'),('SHYAM');
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM Student_serial;
+------------+-------+
| Student_id | Name |
+------------+-------+
| 1 | RAM |
| 2 | SHYAM |
+------------+-------+
2 rows in set (0.00 sec)
mysql> SHOW CREATE TABLE Student_serial\G
*************************** 1. row ***************************
Table: Student_serial
Create Table: CREATE TABLE `student_serial` (
`Student_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(20) DEFAULT NULL,
UNIQUE KEY `Student_id` (`Student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
まとめ
AUTO_INCREMENTは柔軟な自動採番のための属性で、データ型や主キーの構成を自由に設計できます。一方、SERIALは「符号なしBIGINT+NOT NULL+AUTO_INCREMENT+UNIQUE」を一括で指定できる便利なショートカットです。単純な一意ID列を手軽に作りたい場合はSERIALを、より細かい制御が必要な場合はAUTO_INCREMENTを選ぶとよいでしょう。
-
MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?
結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造
-
MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?
MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970 (