#SQLの制約と指定方法
##前回までの流れ
前回は、SQLの四大命令文についてまとめました。
→SQLの四大命令文まとめ
今回は制約についてまとめています。
##SQLの制約とは?
制約とは、テーブルに格納するデータを制限する方法です。
データ型によって、
- 整数であるか?
- 文字列であるか?
といったデータの種類を限定することはできますが、それだけでは、
- 正数のデータのみを受け付ける
- 同じデータが重複してはいけない
とかといった制限を行うことができません。
制約はこのような制限を列やテーブルに対して定義することができます。
※「そもそも、なぜ制約が必要なのか?」と言う方はこちらのサイトがわかりやすいです。
→「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
#1. 制約の種類
- NOT NULL制約
- 一意性制約(UNIQUE KEY)
- 主キー制約 (PRIMARY KEY)
- 外部キー制約 (FOREIGN KEY)
- チェック制約
#2. 制約と指定方法
特に使用頻度が高い、
- NOT NULL制約
- 主キー制約
を中心に説明します。
##2.1 NOT NULL
NULL値を禁止
CREATE TABLE user_table (
user_id INT PRIMARY KEY,
user_name VARCHAR(50) NOT NULL, // ここ
tel_no VARCHAR(50) NOT NULL // ここ
);
##2.2 UNIQUE KEY(一意性制約)
-
重複した値を禁止
一意性 = 「オンリーワンな値」 という意味で思ってもらえば大丈夫です。
つまり、
一意性制約 = **「他の行の値と重複する値はダメですよ〜」**という制約。 -
複数の列に設定可能
-
NULLを禁止するわけではない
以下の文は**「電話番号とアドレスは他の人と被っちゃマズイよね〜」**ということで、制約しています。
CREATE TABLE user_table (
user_id INT PRIMARY KEY,
address VARCHAR(255),
tel_no VARCHAR(50) ,
UNIQUE (telephone, address) // ここ
);
#2.3 PRIMARY KEY(主キー制約)
「列」、または「複数の列の組み合わせ」に対して指定
指定できるのは1つのテーブルに1つだけ
一意を保証
重複とNULLを禁止
つまり、「指定された列、または複数の列は重複もNULLもダメですよ〜」ということ。
CREATE TABLE user_table (
user_id INT PRIMARY KEY, // ここ
user_name VARCHAR(50) NOT NULL,
tel_no VARCHAR(50) NOT NULL
);
#2.4 FOREIGN KEY(外部キー制約)
他のテーブルの列を参照し、その列にある値以外は禁止
以下の例を見てみよう。
2つのテーブルがある。
###■ 生徒テーブル
CREATE TABLE student (
student_id INT PRIMARY KEY,
student_name VARCHAR(20),
school_id INT,
age INT
);
###■ 学校テーブル
CREATE TABLE school (
school_id INT PRIMARY KEY,
school_name VARCHAR(20)
);
といったときに、
生徒(student)テーブルのschool_idの値には、
学校(school)テーブルのschool_idの値を入れ、
「その生徒がどの学校に在籍しているかを紐づけたい」という場合がありますよね。
その場合は、生徒テーブルに外部キー制約を以下のように指定すれば良い。
###■ 生徒テーブル
CREATE TABLE student (
student_id INT PRIMARY KEY,
student_name VARCHAR(20),
school_id INT,
age INT
// 以下の部分
FOREIGN KEY (school_id)
REFERENCES school (school_id)
);
###解説
FOREIGN KEY (school_id) ・・・どの列に外部キーで制約をつけるのか(参照元)
REFERENCES school (school_id) ・・・どのテーブルの、どの列を参照するか(参照先)
つまり、以下が式になる。
FOREIGN KEY (制約をつけたい列名)
REFERENCES 参照したいテーブル (参照したい列名)
#まとめ
以上、SQLの制約と指定方法についてのまとめでした。
間違ってる点があれば、ご指摘お願いします(^ ^)