1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQLの制約と指定方法まとめ

Last updated at Posted at 2019-10-07

#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の制約と指定方法についてのまとめでした。

間違ってる点があれば、ご指摘お願いします(^ ^)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?