Query Go
行を追加する - INSERT の使い方・オプション・サンプル

行を追加する - INSERT

テーブルへの行追加。基本形、複数行まとめて、SELECT 結果から、DEFAULT VALUES まで

概念図

INSERT diagram

構文

sql
INSERT INTO table (col1, col2) VALUES (v1, v2);

サンプル

1行を挿入する基本形

sql
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');

INSERT の基本

INSERT はテーブルに新しい行を追加する DML です。列リストを明示するのが鉄則で、省略するとテーブルの列順に依存した壊れやすいコードになります。

列リストを省略した INSERT INTO users VALUES (...) は、ALTER TABLE で列が増減した瞬間にバグを起こすので避けましょう。

sql
-- 列リスト明示(推奨)
INSERT INTO users (name, email, created_at)
VALUES ('Alice', 'alice@example.com', CURRENT_TIMESTAMP);

複数行まとめて INSERT

1 文で複数行を挿入できます。1 行ずつ別 INSERT を投げるより 圧倒的に高速で、ネットワーク往復とトランザクションオーバーヘッドが減ります。

PostgreSQL / MySQL / SQLite / SQL Server すべてで VALUES の複数タプル指定をサポートしています。

sql
INSERT INTO products (sku, name, price) VALUES
  ('A001', 'Pen', 100),
  ('A002', 'Notebook', 300),
  ('A003', 'Eraser', 80);

INSERT ... SELECT

別のテーブル(またはサブクエリ結果)から直接行をコピーできます。集計結果の保存・テーブル分割・マスタのコピーなどに使います。

VALUES 句は書きません。SELECT が返す列数・型が挿入先と一致している必要があります。

sql
INSERT INTO orders_archive (id, user_id, amount, ordered_at)
SELECT id, user_id, amount, ordered_at
FROM orders
WHERE ordered_at < '2025-01-01';

DEFAULT VALUES と DEFAULT キーワード

全列が DEFAULT 値を持つなら INSERT INTO logs DEFAULT VALUES; で空の INSERT が書けます(SQL Server / PostgreSQL / SQLite 対応、MySQL は INSERT INTO logs () VALUES (); で代用)。

個別列だけ DEFAULT を使いたい場合は VALUES (DEFAULT, ...) と書きます。auto-increment / serial 列の明示指定に便利です。

sql
-- PostgreSQL / SQL Server / SQLite
INSERT INTO logs DEFAULT VALUES;

-- 個別列に DEFAULT
INSERT INTO users (id, name, created_at)
VALUES (DEFAULT, 'Bob', DEFAULT);

落とし穴: 大量 INSERT とトリガ

  • 1 行ずつループで INSERT: N 回の往復で致命的に遅い。必ず複数行 VALUES かバルクロード(COPY / LOAD DATA)を検討
  • トリガによる増幅: 行単位トリガがあると 10 万行 INSERT で 10 万回トリガが走る。メンテ時は一時無効化も検討
  • オートインクリメントの歯抜け: INSERT がロールバックされても連番は戻らない。連番の連続性は保証されないと理解する

関連トピック