【SQL基礎】制約の種類
CREATE TABLE文等ででてきましたが、カラムにはデータ型以外にも入力可能なデータを意図的に制限する制約を設定することができます。
制約を設定することで、データ型よりさらに細かく、入力してほしくない想定外なデータの入力を防ぐことができます。
代表的な制約は下記となります。
1. NOT NULL制約
この制約が設定されているカラムにはNULLを挿入することができません。
NULLとは何もデータ入力されていない状態です。
その為、なんらかのデータが入っていなければエラーとなってしまいます。
必ず何かを入力してほしいカラムに設定しておきましょう。
使用例)
CREATE TABLE sample ( col_name1 VARCHAR(10), col_name2 VARCHAR(10) NOT NULL );
2. DEFAULT制約
この制約でカラムの初期値を設定することが可能です。
データを挿入する際、この制約が設定されたカラムのデータ入力を省略した場合に、設定された初期値がカラムに格納されます。
DEFAULT制約を設定しない場合の初期値はNULLになります。
使用例)
CREATE TABLE sample ( col_name1 VARCHAR(10), col_name2 VARCHAR(10) DEFAULT "N/A", col_name3 INT(11) DEFAULT 0, col_name4 DATETIME DEFAULT "2020-10-30" );
3. PRIMARY KEY(主キー)制約
主キーとは、テーブル内の1つの行を一意に特定できるカラムのことです。
主キーに指定されたカラムは、前述のとおり一意な値である必要があるため、重複したデータを入力しようとするとエラーとなります。
また、必ずデータが格納されている必要があるため、NULLを挿入することもできません。
使用例)
CREATE TABLE sample ( col_name1 VARCHAR(10) PRIMARY KEY, col_name2 VARCHAR(10) ); -- または CREATE TABLE sample2 ( col_name1 VARCHAR(10), col_name2 VARCHAR(10), PRIMARY KEY(col_name1) );
4. AUTO_INCREMENT
AUTO_INCREMENTは主キー制約と一緒に設定する必要があります。
この属性が設定されたカラムのデータ入力を省略した場合、レコードが追加されるたびに+1された値が自動的にカラムに入力されていきます。
使用例)
CREATE TABLE sample ( col_name1 INT(10) PRIMARY KEY AUTO_INCREMENT, col_name2 VARCHAR(10) );
5.UNIQUE KEY制約
カラムにUNIQUE KEY制約を設定すると、そのカラムには重複した値を入れることができなくなります。
また、UNIQUE KEYはPRIMARY KEY(主キー)と違い、NULL入れることが可能です。
使用例)
CREATE TABLE sample ( col_name1 VARCHAR(10) UNIQUE KEY, col_name2 VARCHAR(10) ); -- または CREATE TABLE sample2 ( col_name1 VARCHAR(10), col_name2 VARCHAR(10), UNIQUE KEY(col_name1) );
6.FOREIGN KEY(外部キー)制約
外部キー制約は、テーブル間のカラム同士を関連付け、データの整合性を保つために設定します。
以下のような教員テーブル(teachers)と授業テーブル(class)があった場合
たとえば、teacher_idが1のタロウはclass_idが2で物理の授業を担当していること表しています。
このように参照している側(教員テーブル)を子テーブル、参照元(授業テーブル)のことを親テーブルといい、子テーブル側のclass_idを外部キーといいます。
また、外部キーを設定すると整合性を保つために以下ような操作を実行するとエラーになりできません。
・教員テーブル(子テーブル)のclass_idに存在する値の、授業テーブル(親テーブル)のclass_idのUPDATE、DELETE
・授業テーブル(親テーブル)のclass_idに存在しない値で、教員テーブル(子テーブル)のclass_idをINSERT、UPDATE。
使用例)
まずは、親テーブルであるclassテーブルを作成します。
CREATE TABLE class ( class_id INT(11), name VARCHAR(50), PRIMARY KEY (class_id) );
次に子テーブルであるteachersテーブルを作成します。
CREATE TABLE teachers ( teacher_id INT(11) AUTO_INCREMENT, name VARCHAR(50), address VARCHAR(50), age INT(3), class_id INT(11), PRIMARY KEY (teacher_id), FOREIGN KEY (class_id) REFERENCES class (class_id) );