コース一覧
SQL実践:JOIN・サブクエリ・データ更新
制約 (NOT NULL / UNIQUE / DEFAULT)

SQL実践:JOIN・サブクエリ・データ更新

JOIN、集合演算、サブクエリ、CTE、DDL・DMLを学び、複数テーブルを組み合わせてデータベースを作成・更新する無料コースです。

1
テーブル結合
01. なぜ結合が必要か5分
02. INNER JOINの基本5分
03. LEFT/RIGHT OUTER JOIN5分
04. 複数テーブルの結合5分
05. 自己結合5分
06. 集合演算 UNION/INTERSECT/EXCEPT5分
07. 結合の実践演習5分
08. テーブル結合クイズ5分
2
サブクエリ活用
01. サブクエリとは5分
02. WHERE句のサブクエリ5分
03. FROM句のサブクエリ5分
04. SELECT句のサブクエリ5分
05. WITH句(CTE)の活用5分
06. サブクエリ実践クイズ5分
3
テーブル作成とデータ操作
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分

制約 (NOT NULL / UNIQUE / DEFAULT)

アプリで弾いているのに、変なデータが入る

登録フォームで「メールアドレスは必須」「重複は不可」と検査しているのに、テーブルを覗くとメールが空の行や、同じアドレスの行が 2 つある。これは珍しい話ではありません。

理由は、データの入口がフォームだけではないからです。管理画面、夜間バッチ、他システムからの取り込み、障害対応で手打ちした INSERT。入口が 5 つあれば、同じ検査を 5 か所に書いて、5 か所とも保守し続けることになります。どこか 1 つが漏れた時点で壊れたデータが入り、しかも入った後から直すのは何倍も大変です。

入口が何本あっても効く歯止めを、テーブルの側に置けます。これが制約です。

テーブル定義に書ける歯止め

まず押さえるのは 3 つです。

SQL クエリ

CREATE TABLE coupons (
  id       INT PRIMARY KEY,
  code     VARCHAR(20) NOT NULL UNIQUE,
  discount INT NOT NULL,
  expired  INT NOT NULL DEFAULT 0
);
制約効き目これが無いと起きること
NOT NULL空の値を拒否する割引額が未設定の行が計算式を壊す
UNIQUE同じ値の行を拒否する同じクーポンコードが 2 枚発行される
DEFAULT省略されたときの値を決める指定を忘れた行だけ NULL になって判定できない

DEFAULT には CURRENT_TIMESTAMP のような関数も書けます。作成時刻の列に入れておくと、アプリが時刻を渡し忘れても DB が埋めてくれます。

弾かれると、直す処理が要らなくなる

制約に反する書き込みは、その文が失敗します。

SQL クエリ

INSERT INTO coupons (id, code, discount) VALUES (1, 'SPRING10', 100);
INSERT INTO coupons (id, code, discount) VALUES (2, 'SPRING10', 200);
-- 2 行目が UNIQUE 違反で失敗する。1 行目は入ったまま

大事なのは、速く気づけることより「入ってから直す」仕事が消えることです。壊れたデータを探すクエリも、修復スクリプトも、その結果を確かめる手順も、そもそも要らなくなります。アプリ側の検査は使い勝手のため(画面に赤字を出すため)に残しますが、最後に間違いを止めるのは DB です。

ただし後から制約を足すときは順番があります。すでに NULL が入っている列に NOT NULL を足そうとしても、その ALTER TABLE は失敗します。前回の 3 段階と同じで、先に UPDATE で埋めてから締めます。

解説

知らないテーブルを渡されたら、まず定義の NOT NULL と UNIQUE を見ます。どの列が必須で、何が重複してはいけないのか、つまりそのテーブルが守っている業務ルールが、仕様書より正確に書いてあります。

テーブル構造

SELECT 1;

期待される出力

idemailnameis_active
1a@example.com田中1
2b@example.com佐藤0
3c@example.com山田1

ヒント

UNIQUE は列定義の右側に NOT NULL と並べて書ける

DEFAULT は省略時の値を決める。3 件目の INSERT で is_active を省略する

確認用 SELECT は変更不要

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

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

  • フォームinput(text, email, password, checkbox, radio)、select、textarea、button。
  • テーブルDB の表 (Excel のシートみたいなもの)
  • 関数処理に名前を付けて再利用できる単位
  • 処理計算や代入を表す長方形
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...