INSERT 文でデータを追加する
列名を書かないと、列が増えた日に静かに壊れる
INSERT には 2 つの書き方があります。
SQL クエリ
-- 列名を省く書き方 テーブル定義の並び順にそのまま入る
INSERT INTO staff VALUES (1, '田中', '2026-04-01');
-- 列名を書く書き方
INSERT INTO staff (id, full_name, hired_on)
VALUES (1, '田中', '2026-04-01');上の書き方は、後から誰かが列を 1 つ足した瞬間に、値が 1 つずつずれます。しかも、ずれた先の型がたまたま合っていると、エラーにならずに間違った行が入ります。エラーで止まってくれない不具合は、見つかるまでに何か月もかかります。本番のコードでは必ず列名を書きます。
3 行入れるのに、3 回往復しない
行を 3 つ入れたいとき、INSERT を 3 回書く必要はありません。VALUES の後ろにカンマで並べれば、1 文で何行でも入ります。
SQL クエリ
INSERT INTO staff (id, full_name, hired_on) VALUES
(1, '田中', '2026-04-01'),
(2, '佐藤', '2026-04-01'),
(3, '鈴木', '2026-05-16');1 行ずつ投げると、行の数だけデータベースとの往復が発生します。3 行なら誤差ですが、初期データを数千行入れるときには、待ち時間がはっきり変わります。
書かなかった列には、DEFAULT が入る
列名を書く方式では、一部の列を省けます。省いた列には DEFAULT で決めた値が入り、DEFAULT が無ければ NULL が入ります。
SQL クエリ
CREATE TABLE messages (
id INT PRIMARY KEY,
body TEXT NOT NULL,
is_read INT NOT NULL DEFAULT 0
);
-- is_read を省いても、0 が入る
INSERT INTO messages (id, body) VALUES (1, 'はじめまして');ここで body を省くと、NOT NULL に反するのでエラーになり、行は 1 つも入りません。「制約に反する行は最初から入れない」というのが INSERT の性格です。テーブルを作るときに制約を丁寧に付けておくと、アプリ側のうっかりでおかしなデータが混ざるのを、データベースが手前で止めてくれます。
現場の話 文字列は必ずシングルクォートで囲みます。逆に、数値の列に
'120000'と引用符付きで渡しても、多くのデータベースは黙って変換して通します。動いてしまうぶん気付きにくく、レビューでは指摘される書き方です。
テーブル構造
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price INT NOT NULL,
stock INT NOT NULL DEFAULT 0
);期待される出力
| id | name | price | stock |
|---|---|---|---|
| 2 | ワイヤレスマウス | 3500 | 50 |
| 3 | 外付けSSD 1TB | 14800 | 20 |
| 1 | ノートPC | 120000 | 10 |