コース一覧
SQL入門:データベース操作のきほん
FOREIGN KEY制約の設定

SQL入門:データベース操作のきほん

SELECT、INSERT、UPDATE、DELETE に加え、WHERE、JOIN、GROUP BY、サブクエリなど SQL の基礎構文を、ブラウザ上のサンプル DB を操作しながら学べる無料コースです。データ分析やアプリ開発で SQL を初めて学ぶ社会人や学生を対象としています。約 18 時間 (1 日 30 分 × 36 日) で 71 レッスンを修了でき、修了後は業務データの抽出、集計、簡単なレポート作成を SQL で行えるようになります。

1
SQLとデータベースの基礎
01. データベースとは何か5分
02. リレーショナルDBの仕組み5分
03. テーブル・行・列の基本5分
04. 主キーとNULL制約5分
05. 基礎確認クイズ5分
2
データの取得 - SELECT文マスター
01. SELECT文の基本構文5分
02. WHERE句で条件絞り込み5分
03. 比較演算子とLIKEパターン5分
04. AND/OR/NOTで複合条件5分
05. ORDER BYでソート5分
06. LIMITで件数制限5分
07. 日付関数の活用5分
08. データ取得チャレンジ5分
3
データ集計と分析
01. 集計関数 COUNT/SUM/AVG/MAX/MIN5分
02. NULLの扱い方5分
03. 算術演算とエイリアス5分
04. CASE式で条件分岐5分
05. DISTINCTで重複排除5分
06. 文字列関数5分
07. GROUP BYでグループ化5分
08. HAVINGでグループ条件5分
09. SELECT文の実行順序5分
10. 集計分析チャレンジ5分
4
テーブル結合
01. なぜ結合が必要か5分
02. INNER JOINの基本5分
03. LEFT/RIGHT OUTER JOIN5分
04. 複数テーブルの結合5分
05. 自己結合5分
06. 集合演算 UNION/INTERSECT/EXCEPT5分
07. 結合の実践演習5分
08. テーブル結合クイズ5分
5
サブクエリ活用
01. サブクエリとは5分
02. WHERE句のサブクエリ5分
03. FROM句のサブクエリ5分
04. SELECT句のサブクエリ5分
05. WITH句(CTE)の活用5分
06. サブクエリ実践クイズ5分
6
テーブル作成とデータ操作
01. CREATE DATABASE と CREATE TABLE5分
02. データ型の選び方5分
03. INSERT 文でデータを追加する5分
04. UPDATE 文でデータを更新する5分
05. DELETE 文でデータを削除する5分
06. 物理削除と論理削除5分
07. ALTER TABLE で構造を変更する5分
08. 制約 (NOT NULL / UNIQUE / DEFAULT)5分
09. TRUNCATE と DROP5分
10. DDL / DML 実践クイズ5分
7
外部キーと参照整合性
01. 外部キーの役割5分
02. FOREIGN KEY制約の設定5分
03. ON DELETE/UPDATE ポリシー5分
04. CASCADE vs RESTRICT vs SET NULL5分
05. 物理FK vs 論理FK5分
06. 外部キークイズ5分
8
データモデリング入門
01. データモデリングとは5分
02. ER図の読み方・書き方5分
03. エンティティと属性5分
04. リレーションシップとカーディナリティ5分
05. 1対1/1対多/多対多の設計5分
06. モデリング基礎クイズ5分
9
正規化
01. なぜ正規化が必要か5分
02. 第1正規形 (1NF)5分
03. 第2正規形 (2NF)5分
04. 第3正規形 (3NF)5分
05. 非正規化の判断5分
06. 正規化クイズ5分
10
物理設計とインデックス
01. 物理設計の考え方5分
02. 命名規則のベストプラクティス5分
03. インデックスの仕組み5分
04. CREATE INDEXの使い方5分
05. インデックス設計の注意点5分
06. 物理設計クイズ5分

FOREIGN KEY制約の設定

子を先に作ると、その場で落ちる

外部キーを書いた CREATE TABLE をファイルの上から順に流したら、いきなりエラーで止まった。よくある詰まり方で、原因は順番です。REFERENCES customers(id) と書いた時点で customers が存在していないと、DB は参照先を確かめられません。親を先に作り、子を後に作る。この順序は動かせません。

同じ理由で、片付けるときは逆になります。子のテーブルを先に消さないと、親のテーブルは消せません。

書き方は 3 通り、名前は自分で付ける

SQL クエリ

-- 列の定義の中に書く CREATE TABLE orders ( id INT PRIMARY KEY, customer_id INT REFERENCES customers(id) ); -- 定義の末尾にまとめて書く。名前を付けられる CREATE TABLE orders ( id INT PRIMARY KEY, customer_id INT, CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ); -- すでにあるテーブルに後から足す ALTER TABLE orders ADD CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers(id);

1 つ目が最短ですが、制約の名前は DB が勝手に決めます。名前が要るのは、外したり付け替えたりするときです。

SQL クエリ

ALTER TABLE orders DROP CONSTRAINT fk_orders_customer;

自動で付いた名前は orders_customer_id_fkey のような形で、DBMS ごとに規則が違います。運用中に「この制約を一時的に外したい」となってから調べるのは面倒なので、最初から fk_子テーブル_親テーブル の形で自分で名前を書いておくのが定石です。

後から足すときは、先にデータを直す

ALTER TABLE での後付けは、既存の全行が条件を満たしているかを DB が確かめてから通ります。親に存在しない値を持つ行が 1 つでもあれば、ALTER そのものが失敗します。

つまり手順は 3 段階になります。まず孤児を洗い出し、次に消すか正しい親に付け替え、それから制約を足します。この順番を飛ばすと、エラーメッセージだけを見て「このテーブルには制約を張れない」と誤解することになります。制約が拒んでいるのは、すでに壊れている今のデータです。

解説

制約を外す構文は DBMS で分かれます。DROP CONSTRAINT が通らない環境では ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer; のように書きます。手元の DB で一度試してから、本番の手順書に写してください。

テーブル構造

CREATE TABLE departments ( id INT PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE employees ( id INT PRIMARY KEY, name TEXT NOT NULL, department_id INT, CONSTRAINT fk_employees_department FOREIGN KEY (department_id) REFERENCES departments(id) ); INSERT INTO departments (id, name) VALUES (1, '営業'), (2, '開発'), (3, '人事'); INSERT INTO employees (id, name, department_id) VALUES (101, '田中', 1), (102, '佐藤', 2), (103, '鈴木', 2), (104, '高橋', 3);

期待される出力

departmentmember_count
開発2
人事1
営業1

ヒント

FK で従業員が必ず実在する部署を参照していることを利用する

LEFT JOIN を使えば従業員 0 人の部署も拾える

GROUP BY と ORDER BY の順番に注意

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 外部キーテーブル同士を結びつける鍵
  • テーブルDB の表 (Excel のシートみたいなもの)
  • エラーメッセージプログラムが出す失敗の通知
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...