行を追加する - INSERT
テーブルへの行追加。基本形、複数行まとめて、SELECT 結果から、DEFAULT VALUES まで
概念図
構文
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 がロールバックされても連番は戻らない。連番の連続性は保証されないと理解する
