コース一覧
SQL実践:JOIN・サブクエリ・データ更新
TRUNCATE と DROP

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分

TRUNCATE と DROP

打った瞬間に、戻す手段が無くなる

DELETE はトランザクションの中で実行すれば ROLLBACK で取り消せます。件数を間違えても、COMMIT する前なら引き返せます。

TRUNCATE と DROP にはその救いがありません。多くの DBMS でこの 2 つは暗黙にコミットされ、ROLLBACK を打っても何も戻りません。バックアップが無ければそこで終わりです。同じ「消す」でも、DELETE と残りの 2 つの間には、引き返せるかどうかという断絶があります。

命令消えるもの打った後に戻せるか
DELETEWHERE に合った行だけCOMMIT 前なら ROLLBACK で戻せる
TRUNCATEそのテーブルの全行戻せない。バックアップから入れ直す
DROP TABLE行に加えてテーブル定義そのもの戻せない。定義を書き直して作り直す

TRUNCATE に WHERE は付きません。全行専用です。1 行ずつ消さずにテーブルを作り直すのに近い動きをするので DELETE よりずっと速く、検証用のデータを毎晩まっさらにする用途に向いています。

SQL クエリ

-- 検証用データを毎回同じ状態に戻す
TRUNCATE TABLE staging_prices;

戻せないのは行だけではありません。TRUNCATE は自動採番のカウンタも初期値に戻すことがあります。つまり次に入る行の id が 1 からやり直しになり、消したはずの過去の行と同じ番号が振られます。外部のログや別システムがその番号を控えていると、別のデータを指すようになります。

DROP TABLE はテーブルの定義ごと消します。実行後は SELECT も INSERT も通りません。同じ名前で作り直しても中身は空です。

消す前にワンクッションを置く

もう使っていないはずのテーブルを片付けるとき、いきなり DROP せず、まず名前を変えて様子を見る手があります。

SQL クエリ

RENAME TABLE daily_report TO zz_old_daily_report;

名前が変われば、まだ参照している処理があればその時点で落ちます。数日から数週間なにも起きないことを確かめてから消せば、判断を間違えても名前を戻すだけで復旧できます。

同じスクリプトを 2 回流すと落ちる

セットアップ用の SQL に DROP TABLE をそのまま書くと、2 回目の実行でテーブルが無くてエラーになります。

SQL クエリ

DROP TABLE IF EXISTS zz_old_daily_report;

IF EXISTS を付けると、対象が無くても静かに通ります。何度流しても同じ結果になるので、環境構築や後片付けの SQL では標準的な書き方です。

解説

本番で TRUNCATE や DROP を打つ前に、必ず 2 つ言葉にします。バックアップは取ったか、戻す手順は書いてあるか。この 2 つが埋まらないうちは実行しない、を癖にしてください。

テーブル構造

CREATE TABLE tmp_import (
  id INT PRIMARY KEY,
  payload VARCHAR(100) NOT NULL
);

INSERT INTO tmp_import (id, payload) VALUES
  (1, 'old-1'),
  (2, 'old-2'),
  (3, 'old-3');

CREATE TABLE archive_log (
  id INT PRIMARY KEY,
  message VARCHAR(100) NOT NULL
);

INSERT INTO archive_log (id, message) VALUES
  (1, 'kept');

期待される出力

table_name
archive_log

ヒント

TRUNCATE TABLE テーブル名 で全行を瞬時に消せる

DROP TABLE テーブル名 でテーブル定義も消える

archive_log には手を出さない

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

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

  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • コミット変更内容を記録するスナップショット
  • テーブルDB の表 (Excel のシートみたいなもの)
  • カウンタ数を保持して増減する典型 UI
  • 処理計算や代入を表す長方形
  • 判断YES/NO 分岐を表す菱形
  • セット重複を持たない順序なし集合
  • SQLデータベースを操作するための共通言語
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...