主キーの設定
ここまでのテーブル作成は、列名とデータ型を指定してきましたが、リレーショナルデータベースの最大の特徴は、複数の表を連携させて意味を持たせることでした。
また、データベースでは1つのレコードはユニーク(一意:必ず1つだけが特定できる)でなければなりません。
表と表を関連付けるリレーショナルシップには、主キーを設定します。
主キーに、ユニークなレコードを作る場合、列に、他の列と区別するための特別な属性を指定します。
主キーを設定するには、PRIMARY KEY制約を設定します。
PRIMARY KEY制約を設定すると、次の2つの制約も同時に設定されます。
- 値の重複がない(UNIQUE制約)
- 必ずデータを入力しなければならない(NOT NULL制約)
主キーなどの制約の設定は「CREATE TABLE」文の中でテーブル作成時に設定する方法と、「ALTER TABLE」文の中で後から設定する方法があります。
【書式】主キーの設定をしてテーブルを作成する
CREATE TABLE テーブル名 ( 列名 データ型 PRIMARY KEY );
次の例は、[syain_master]テーブルを元に「syain_master_const」という新しいテーブルに主キー列を追加しています。
「syain_master_const」テーブルのテーブル構造
テーブルを作成するSQL文を「syain_master_const_sql.txt」に記述し、C:¥db_primary
に保存
[C:¥db_primary¥syain_master_const_sql.txt]
CREATE TABLE syain_master_const ( syain_no CHAR(5) PRIMARY KEY, syain_name VARCHAR(20), shop_no CHAR(5) );
「syain_master_const_sql.txt」をsourceコマンドで実行
mysql> source C:¥db_primary¥syain_master_const_sql.txt Query OK, 0 rows affected (0.06 sec)
「syain_master_const」テーブルの構造
「syain_no」列の[Key]に「PRI」と表示され、「PRIMARY KEY制約」(主キー)が設定されています。
また、[Null]に「NO」と表示され、NULL値を許可しない、すなわち「NOT NULL制約」が設定されています。
PRIMARY KEY制約を設定すると、このようにNOT NULL制約も自動的に設定されます。
また同時に、UNIQUE制約も設定されますので、重複したデータを挿入できなくなります。
ここで、社員番号が重複する次のデータを入力してみましょう。
「PRIMARY KEYが設定されている列に、’F001M’という重複したデータが入力されました」というエラーメッセージが表示されています。
INSERTコマンドはエラーになっているので、[syain_master_const]テーブルにはデータは登録されていません。
mysql> SELECT * FROM syain_master_const; Empty set (0.00 sec)
【書式】すでにあるテーブルの列に主キーを設定する
ALTER TABLE テーブル名 ADD PRIMARY KEY ( 列名 );
次の例は、[syain_master]テーブルの[syain_no]にPRIMARY_KEYを設定しています。
mysql> ALTER TABLE syain_master ADD PRIMARY KEY ( syain_no ); Query OK, 8 rows affected (0.37 sec)
[syain_no]列にPRIMARY KEYが設定されているのがわかります。
[syain_master]テーブルに登録されているレコードを確認します。
[syain_no]の値が重複する次のレコードを挿入してみます。
「PRIMARY KEYが設定されている列に、’F001C'という重複した値を入力している」というエラーメッセージが表示されています。
このようにPRIMARY KEY制約が設定されている列には、すでに登録されている値を登録することはできません。
UNIQUE制約(一意キー)の設定
【書式】一意キーの設定をしてテーブルを作成する
CREATE TABLE テーブル名 ( 列名 データ型 UNIQUE );
【書式】すでにあるテーブルの列に一意キーを設定する
ALTER TABLE テーブル名 ADD UNIQUE ( 列名 );
次の例は、[syain_master]テーブルの[serial_no]列に、UNIQUE制約を追加しています。
mysql> ALTER TABLE syain_master ADD UNIQUE ( serial_no ); Query OK, 0 rows affected (0.50 sec)
[serial_no]列の値が重複する次のデータを入力してみましょう。
「[serial_no]列の'100'というデータが重複している」というエラーメッセージが表示されています。
NOT NULL制約の設定
【書式】NOT NULL制約の設定をしてテーブルを作成する
CREATE TABLE テーブル名 ( 列名 データ型 NOT NULL );
【書式】すでにあるテーブルの列にNOT NULL制約を設定する
ALTER TABLE テーブル名 CHANGE COLUMUN 変更前列名 変更後列名 データ型 NOT NULL;
ポイント
MySQLでは、他の制約のようにテーブルの作成後に「ALTER TABLE」文のADD句で任意の列にNOT NULL制約のみを設定することはできません。
MySQLでNOT NULL制約を追加するには「ALTER TABLE」文の「CHANGE COLUMN」句を使用して、列ごと定義を変更します。
次の例は、[syain_master]テーブルの[syain_name]列に、NOT NULL制約を設定しています。
mysql> ALTER TABLE syain_master CHANGE COLUMN syain_name syain_name VARCHAR(20) NOT NULL; Query OK, 8 rows affected (0.05 sec)
[syain_name]列にNOT NULL制約が追加されていることがわかります。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】