MySQLの主キーフィールドにNOT NULLを追加する必要がない理由
MySQLの主キーにNOT NULLを指定する必要がない理由
MySQLでは、主キー(PRIMARY KEY)フィールドにNOT NULLを明示的に追加する必要はありません。主キーを作成した時点で、MySQLが内部的に自動的にNOT NULL制約を適用してくれるからです。つまり、主キーとは「NOT NULL」と「ユニークキー(一意制約)」の両方の性質を兼ね備えたものなのです。
主キーを持つテーブルの作成例
実際に主キーフィールドの動作を確認してみましょう。まずはテーブルを作成します。
mysql> create table NotNullAddDemo
-> (
-> Id int AUTO_INCREMENT,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.81 sec)
上記のテーブルでは、主キーフィールドにNOT NULLを追加していませんが、MySQLが内部的にNOT NULLへ変換してくれます。これが正しく適用されているかどうかは、次の構文で確認できます。
DESC テーブル名;
DESCコマンドでテーブル定義を確認する
mysql> desc NotNullAddDemo;
実行結果は以下の通りです。
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.07 sec)
「Null」列に「NO」と表示されている点に注目してください。これはNULL値が許可されていないことを意味し、NOT NULL制約が自動的に適用されている証拠です。
NULL値を挿入した場合の動作
NOT NULL制約が実際に機能しているか確認するため、あえてNULLレコードを挿入してみます。AUTO_INCREMENTが設定されているため、NULLを挿入してもエラーにはならず、代わりに連番が自動的に採番されます。
mysql> insert into NotNullAddDemo values(NULL);
Query OK, 1 row affected (0.12 sec)
mysql> insert into NotNullAddDemo values(NULL);
Query OK, 1 row affected (0.45 sec)
主キーに対してNULLを2回挿入した後、値「1」を挿入しようとするとエラーが発生します。これは、MySQLが最初のNULLを「1」、2番目のNULLを「2」としてカウントしているためです。
値「1」を挿入しようとした場合のエラーは以下の通りです。
mysql> insert into NotNullAddDemo values(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
一方、値「3」を挿入すれば正常に受け付けられます。
mysql> insert into NotNullAddDemo values(3);
Query OK, 1 row affected (0.21 sec)
mysql> insert into NotNullAddDemo values(NULL);
Query OK, 1 row affected (0.18 sec)
テーブル内の全レコードを確認する
SELECT文を使って、テーブル内のすべてのレコードを表示してみましょう。
mysql> select *from NotNullAddDemo;
実行結果:
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
このように、NULLとして挿入したレコードにも自動的に連番が割り振られていることが確認できます。
まとめ
MySQLの主キーには自動的にNOT NULL制約が適用されるため、CREATE TABLE時にNOT NULLを明示的に記述する必要はありません。DESCコマンドでテーブル構造を確認し、「Null」列が「NO」になっていれば、NOT NULLが有効になっていることが簡単に判断できます。
-
MySQLでNOT NULLの値に対して1を設定する方法(IF関数とIS NOT NULLの使い方)
MySQLでNOT NULLの値に1を設定するにはMySQLでは、IS NOT NULL演算子とIF()関数を組み合わせることで、値がNULLでない場合に「1」、NULLの場合に「0」を返すことができます。データの存在チェックやフラグ管理など、さまざまな場面で活用できる便利なテクニックです。基本構文NOT NULLかどうかを判定して1を設定する基本構文は以下のとおりです。select if( is not NULL,1,0) as anyAliasName;実際に動作するクエリを見てみましょう。mysql> select if( is not NULL,1,0);このクエリを実行すると、
-
MySQLで主キー(AUTO_INCREMENT)をリセットする方法
MySQLで主キー(AUTO_INCREMENT)の値をリセットするには、まずTRUNCATE TABLEでテーブルを空にし、その後ALTER TABLEでAUTO_INCREMENTの開始値を設定します。この記事では、具体的な手順をサンプルコードとともに解説します。 1. サンプルテーブルの作成 まず、AUTO_INCREMENT付きの主キーを持つテーブルを作成します。 mysql> create table DemoTable1929 ( UserId int NOT NULL AUTO_INCREMENT, PRIMARY KEY(UserId) )