20
9

More than 1 year has passed since last update.

SQLプライマリーキー、外部キー、ユニークキーどう使い分ける?

Last updated at Posted at 2021-09-28

はじめに

どうも、未経験からエンジニア転職を目指しているもきおです。

自作ポートフォリオ(自分はRalisで作ってます)を作成していてデータベース設計をしている時、プライマリーキーやら外部キーやらユニークキーやら色んなキー制約があり何使えばいいんや?と感じてました。

今回SQLを改めて学習したのでそれぞれの役割、制約について書き記したいと思います。
SQL削除命令文は以下記事にまとめました。良ければご覧ください。

主キー (PRIMARY KEY)制約

テーブルのレコードを一意に特定するためのKEY

特徴
・一意である
・基本一つのテーブルに一つだけ
・設定するだけでNULLと重複を禁止してくれる

SQL設定例
CREATE TABLE users
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT(3)
);

一意ってなんだ?

一意とは「重複させないよ」、もっとカッコつけて言うと「オンリーワンだよ」ってこと
例:
1,2,3,4,5はそれぞれ重複しないので一意
1,1,1,2,3は1が重複しているので全体としては一意ではない

以下より抜粋

PRIMARY KEY 使用例

基本的にはidに設定すると思います。
スクリーンショット 2021-09-29 6.34.59.png
idを主キー(PRIMARY KEY)にすることで名前が重複していてもid,1のもっさんとid,2のもっさんに区別することができます。

外部キー (FOREIGN KEY)制約

テーブル間の関係性を設定
関連するテーブル間の整合性を保証するためのKEY

SQL設定例
CREATE TABLE orders
(
id INT(10),
user_id INT,
amount INT(20),
price INT(20),
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

先程作成したUsersテーブルとの関連図はこんな感じ
スクリーンショット 2021-09-29 7.18.07.png

外部キーを付与するとこのようにテーブル間の関連性を持たせることができます。
ここではUsersが親テーブル、Ordersが子テーブルとなります。

そしてこのキー設定の後のON DELETE CASCADEとは親テーブルのデータが削除された際にデータの整合性を保つ為、子テーブルも一緒に削除するためのオプションです。

このように外部キーを設定することでテーブル間で関連付けられた設定を行うことができます。

ユニークキー (UNIQUE KEY)制約

プライマリーキー以外のデータの重複を禁止

特徴
・重複を禁止
・複数設定可能

SQL設定例
CREATE TABLE users
(
id INT(3) AUTO_INCREMENT,
name VARCHAR(255),
email VARCHAR(255),
PRIMARY KEY (id),
UNIQUE KEY (email)
);

UNIQUE KEY 使用例

emailとかパスワードとかの重複を防ぎたいものに対し設定することが多いかと思います。

あとがき

今まで見様見真似で使用してしまってましたが整理することができました。

アプリケーション作成時にはデータベース設計が必ずと言っていいほど絡んでくるので引き続きSQLの理解に努めていきたいと思います。

この記事が少しでも良いと感じていただけましたらLGTMポチッとしていただけますと幸いです。

20
9
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
20
9