Q1INSERT INTO book (title, price) VALUES ('SQL入門', 1980); を実行した時、列リストに含めなかった id 列(INTEGER PRIMARY KEY)の値はどうなりますか。
INSERT — テーブルにデータを追加する
SQL の INSERT 文を基礎から解説します。列名指定の基本形、列名省略形、複数行を一度に追加する書き方の 3 パターンを、それぞれ別のテーブルで図解しながらブラウザで実行して学べます。
INSERT — テーブルに行を追加する
テーブルに新しい行を追加するには INSERT 文を使います。SELECT が「データを 読む」操作だったのに対し、INSERT は「データを 挿入する」もっとも基本の操作です。ユーザー登録・購入記録・ログ書き込みなど、アプリが何かを「保存する」場面のほとんどが INSERT で行います。
列名を指定して値を入れる(基本形)
もっとも一般的な書き方は、入れたい列名と値の両方を明示する 形です。INSERT INTO 表名 (列, 列, ...) VALUES (値, 値, ...); のように、テーブル名のあとに丸括弧で列リストを並べ、VALUES のあとに同じ順序・同じ個数の値を並べます。
この書き方では 列リストに書かなかった列は自動的に NULL(または列の DEFAULT) になります。INTEGER PRIMARY KEY 列を省略した場合は自動採番が働き、空いている整数が振られます。
INSERT INTO は「どの表に入れるか」、丸括弧の列リストは「どの列に値を入れるか」、VALUES の () の中は「列リストと同じ順序の値」を指定します。3 つの位置と役割をまず押さえます。-- book テーブルに 1 行追加(title と price だけ指定)
INSERT INTO book (title, price) VALUES ('SQL入門', 1980);
-- 結果を確認
SELECT * FROM book;
省略した列はどうなる?
列リストに書かなかった列は、列の DEFAULT 値(指定がなければ NULL)が入ります。INTEGER PRIMARY KEY 列を省略した場合は 自動採番 が働き、空いている整数が振られます(MySQL の AUTO_INCREMENT 相当)。
列名を省略して全列を入れる
もう一つの書き方は、列リストを書かずに全列の値だけを順番に並べる 短縮形です。INSERT INTO 表名 VALUES (値, 値, ...); のように、表名のすぐあとに VALUES が来ます。
短く書ける代わりに、テーブル定義の列順を覚えていないと書けません。また、後から ALTER TABLE で列が増えると、この形の INSERT は 値の個数が合わず壊れる ため、一時データの投入や使い捨てスクリプトのような限定的な場面で使う書き方になります。
-- task テーブルに 1 行追加(列リストを省略する短縮形)
INSERT INTO task VALUES ('掃除', 0);
-- 結果を確認
SELECT * FROM task;
列名省略形は ALTER TABLE で壊れる
INSERT INTO task VALUES ('掃除', 0); は今は 2 列のテーブルなので動きますが、後から ALTER TABLE task ADD COLUMN due_on TEXT; で列を追加すると、全列分の値が 3 つ必要 になり、この INSERT は値の数が合わずエラーで壊れます。
本番のアプリやスクリプトでは 列名指定形(基本形) を選んでおくと、テーブル定義が変わっても INSERT を書き直さずに済みます。短縮形は「テーブル構造が変わらない一時データ」「使い捨てスクリプト」のような限定的な場面に留めるのが安全です。
複数行を一度に追加する
INSERT 文 1 つで 複数の行をまとめて 入れることもできます。VALUES のあとに (値, 値, ...) を カンマ区切りで複数並べる だけで、各 () が 1 行ずつになります。
複数行を 1 つの INSERT で入れる利点は 2 つあります。1 つは 記述量が短くなる こと、もう 1 つは DB への往復が 1 回で済む ことで、行ごとに INSERT を発行するよりも処理が速くなります。CSV やログを一括で取り込むバッチ処理ではこの形を使うのが基本です。
-- product テーブルに 3 行を一度に追加
INSERT INTO product (name, price) VALUES
('りんご', 150),
('バナナ', 100),
('オレンジ', 200);
-- 結果を確認
SELECT * FROM product;
列名省略形が壊れる場面 — ALTER TABLE で列が増えた時
前の章の callout で「列名省略形は ALTER TABLE で壊れる」と書きました。実際に壊れる様子を 1 度だけ体験しておくと、本番で列名省略形を使うべきか迷ったときに判断しやすくなります。
本記事の最後の演習として、スクラッチ用テーブル `task_v2` を作って ALTER TABLE で列を増やし、その前後で同じ列名省略形 INSERT を試します。前は通っていた INSERT が、列が増えた途端に 「値の数が合わない」エラー になることが体感できます。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2次のうち、列名省略形 INSERT INTO 表名 VALUES (...) の説明として正しいものはどれですか。
Q3次のうち、複数行 INSERT の正しい書き方はどれですか。