コマンド道場

INSERT(行を追加する)の使い方

表に行が 1 つ増える

shain実行前

shain_idname
1鈴木
2佐藤
3田中

shain実行後

shain_idname
19
1鈴木
2佐藤
3田中

INSERT INTO shain (…) VALUES (19, '森', …)

  • +の行= この文で表に増える行です
  • 実行前 18実行後 191増えます元の表そのものが変わります

18 行が 19 行になります。増えるのは指定した 1 行だけで、元からある行はそのままです。

INSERT は表に行を足します。 足す値は VALUES で直接書くか、SELECT の結果をそのまま流し込むかの 2 通りです。落ちるときはたいてい表に付けてある約束(制約)に反しているので、エラー文を読めば原因が分かります。

未確認の製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database

未確認: IBM Db2

製品ごとの対応表(根拠つき)を見る

このページの実行結果と図は、すべて本物のデータベースに同じ SQL を流して得たものです。手で書いた「たぶんこうなる」ではありません。

01列の並びと値の並びを対応させる

結論: INSERT INTO 表 (列, 列, …) VALUES (値, 値, …) で 1 行増えます。

列名を書く側と値を書く側は、同じ順番で対応します。数が合わないとエラーになりますが、順番だけ入れ違えても数が合っていれば通ってしまうことがあります。型が同じ列どうしを入れ替えると気づけません。

列名の並びは必ず書いてください。 省略すると表の定義順に依存し、あとから列が増えたときに黙って壊れます。

⚠️ RETURNING を付けると、実際に入った行が返ります。既定値が入る列や自動採番の値を確かめるのに使えます(PostgreSQL / SQLite / MariaDB で使えます)。

1 行ずつ、何をしているか
  1. INSERT INTO shainどの表に入れるか
  2. (shain_id, name, salary, hired_on)★入れる列の並び
  3. VALUESここから値
  4. (19, '森', 460000, '2026-08-01');★上と同じ順番で対応させる

上下の並びがずれると、型が合っている限りエラーにならずに入ってしまいます。

1 行足して、入った内容を確かめる
INSERT INTO shain (shain_id, name, busho_id, joushi_id, salary, hired_on)
VALUES (19, '森', 2, 2, 460000, '2026-08-01')
RETURNING shain_id, name, busho_id, salary;
shain_idnamebusho_idsalary
192460000

1

書いたとおりの値が入りました。RETURNING が返すのは実際に表へ入った行なので、既定値が効く列も確かめられます。

02書かなかった列には NULL が入る

結論: 列名の並びに書かなかった列には、既定値(無ければ NULL)が入ります。

必要な列だけ書けば済むということですが、書き忘れとの区別が付きません。「あとで埋めるつもりの NULL」なのか「入れ忘れた NULL」なのかは、表を見ても分かりません。

⚠️ NOT NULL が付いている列を書き忘れるとエラーで落ちます。これは親切な設計で、落ちてくれるほうが後から探すより安全です。

書かなかった列がどうなるか見る
INSERT INTO shain (shain_id, name, salary, hired_on)
VALUES (23, '省略', 400000, '2026-08-01')
RETURNING shain_id, name, busho_id, joushi_id, taishoku_on;
shain_idnamebusho_idjoushi_idtaishoku_on
23省略NULLNULLNULL

1

busho_id と joushi_id と taishoku_on が NULL になりました。所属も上司も未設定の社員として入っています。

NOT NULL の列を書き忘れる
INSERT INTO shain (shain_id, busho_id, salary, hired_on)
VALUES (20, 2, 400000, '2026-08-01');
ERROR: null value in column "name" of relation "shain" violates not-null constraint

「violates not-null constraint」と出て、name が空のままでは入れられないことが分かります。

03⚠️ よくある間違い:表の約束に反すると落ちる

結論: 落ちる理由はたいてい 3 つのどれかです。 エラー文に制約の名前が出るので、そこを読めば原因が特定できます。

  • 主キーの重複 … 同じ番号の行がすでにある
  • 外部キー違反 … 参照先に存在しない値を入れようとした
  • 検査制約(CHECK)違反 … 列に付けた条件を満たしていない

どれも入れる前に止めてくれているので、エラーを消すために制約を外すのは筋が悪い直し方です。値のほうを直してください。

⚠️ エラー文の末尾に出る shain_pkeyshain_salary_check制約の名前です。表の定義を見れば何を約束していたかが分かります。

すでにある番号を入れる
INSERT INTO shain (shain_id, name, salary, hired_on)
VALUES (1, '重複', 400000, '2026-08-01');
ERROR: duplicate key value violates unique constraint "shain_pkey"

「duplicate key value violates unique constraint」と出ます。shain_id は主キーなので重複できません。

存在しない部署番号を入れる
INSERT INTO shain (shain_id, name, busho_id, salary, hired_on)
VALUES (21, '幽霊', 99, 400000, '2026-08-01');
ERROR: insert or update on table "shain" violates foreign key constraint "shain_busho_id_fkey"

「violates foreign key constraint」と出ます。部署表に 99 番が無いので、所属先の分からない社員は作れません。

給与に 0 を入れる
INSERT INTO shain (shain_id, name, salary, hired_on)
VALUES (22, 'ただ働き', 0, '2026-08-01');
ERROR: new row for relation "shain" violates check constraint "shain_salary_check"

「violates check constraint」と出ます。この表は給与が 0 より大きいことを約束しているためです。

04SELECT の結果をそのまま入れる

結論: VALUES の代わりに SELECT を書くと、問い合わせの結果をそのまま行として入れられます。

値を人が書き写す必要が無いので、写し間違いが起きません。既存の行をもとに新しい行を作るときや、集計結果を別の表へ保存するときに使います。

列の対応は VALUES と同じで、SELECT が返す列の並びINSERT INTO に書いた列の並びに対応します。

⚠️ SELECT が 0 行を返したときは何も入らず、エラーにもなりません。「入ったつもり」で先へ進まないよう、入った件数を確かめてください。

既存の行をもとに 1 行作る
INSERT INTO shain (shain_id, name, busho_id, joushi_id, salary, hired_on)
SELECT 24, name || '(複製)', busho_id, joushi_id, salary, hired_on
FROM shain
WHERE shain_id = 2
RETURNING shain_id, name, salary;
shain_idnamesalary
24佐藤(複製)720000

1

佐藤の行を写して「佐藤(複製)」を作りました。給与や所属を人が書き写していないので、写し間違いが起きません。

⚠️ この書き方は SQL Server では使えません(|| による文字列連結)。製品ごとの対応表

自分で打ってみる

このページの例と同じデータが入った本物のデータベースを、この場(あなたのブラウザの中)で起動できます。打った SQL がサーバーへ送られることはありません。

押すと初回だけ約 9MB を読み込みます(2 回目以降はキャッシュされます)。

解いてみる

読んだだけでは書けるようになりません。実行結果で採点します。

関連するトピック

  • DELETE行を消すほうの操作です。
  • UPDATEすでにある行の値を書き換える操作です。
  • SELECT 句INSERT ... SELECT の SELECT 側はこちらです。
  • IS NULL書かなかった列に入る NULL の扱いはこちらです。

根拠(一次情報)