INSERT(行を追加する)の使い方
shain実行前
| shain_id | name |
|---|---|
| 1 | 鈴木 |
| 2 | 佐藤 |
| 3 | 田中 |
| … | |
shain実行後
| shain_id | name |
|---|---|
| 19 | 森+ |
| 1 | 鈴木 |
| 2 | 佐藤 |
| 3 | 田中 |
| … | |
INSERT INTO shain (…) VALUES (19, '森', …)
- +の行= この文で表に増える行です
- 実行前 18 行 → 実行後 19 行(1 行増えます。元の表そのものが変わります)
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 で使えます)。
INSERT INTO shainどの表に入れるか(shain_id, name, salary, hired_on)★入れる列の並びVALUESここから値(19, '森', 460000, '2026-08-01');★上と同じ順番で対応させる
上下の並びがずれると、型が合っている限りエラーにならずに入ってしまいます。
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_id | name | busho_id | salary |
|---|---|---|---|
| 19 | 森 | 2 | 460000 |
(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_id | name | busho_id | joushi_id | taishoku_on |
|---|---|---|---|---|
| 23 | 省略 | NULL | NULL | NULL |
(1 行)
busho_id と joushi_id と taishoku_on が NULL になりました。所属も上司も未設定の社員として入っています。
INSERT INTO shain (shain_id, busho_id, salary, hired_on)
VALUES (20, 2, 400000, '2026-08-01');「violates not-null constraint」と出て、name が空のままでは入れられないことが分かります。
03⚠️ よくある間違い:表の約束に反すると落ちる
結論: 落ちる理由はたいてい 3 つのどれかです。 エラー文に制約の名前が出るので、そこを読めば原因が特定できます。
- 主キーの重複 … 同じ番号の行がすでにある
- 外部キー違反 … 参照先に存在しない値を入れようとした
- 検査制約(CHECK)違反 … 列に付けた条件を満たしていない
どれも入れる前に止めてくれているので、エラーを消すために制約を外すのは筋が悪い直し方です。値のほうを直してください。
⚠️ エラー文の末尾に出る shain_pkey や shain_salary_check は制約の名前です。表の定義を見れば何を約束していたかが分かります。
INSERT INTO shain (shain_id, name, salary, hired_on)
VALUES (1, '重複', 400000, '2026-08-01');「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');「violates foreign key constraint」と出ます。部署表に 99 番が無いので、所属先の分からない社員は作れません。
INSERT INTO shain (shain_id, name, salary, hired_on)
VALUES (22, 'ただ働き', 0, '2026-08-01');「violates check constraint」と出ます。この表は給与が 0 より大きいことを約束しているためです。
04SELECT の結果をそのまま入れる
結論: VALUES の代わりに SELECT を書くと、問い合わせの結果をそのまま行として入れられます。
値を人が書き写す必要が無いので、写し間違いが起きません。既存の行をもとに新しい行を作るときや、集計結果を別の表へ保存するときに使います。
列の対応は VALUES と同じで、SELECT が返す列の並びが INSERT INTO に書いた列の並びに対応します。
⚠️ SELECT が 0 行を返したときは何も入らず、エラーにもなりません。「入ったつもり」で先へ進まないよう、入った件数を確かめてください。
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_id | name | salary |
|---|---|---|
| 24 | 佐藤(複製) | 720000 |
(1 行)
佐藤の行を写して「佐藤(複製)」を作りました。給与や所属を人が書き写していないので、写し間違いが起きません。
⚠️ この書き方は SQL Server では使えません(|| による文字列連結)。製品ごとの対応表
自分で打ってみる
このページの例と同じデータが入った本物のデータベースを、この場(あなたのブラウザの中)で起動できます。打った SQL がサーバーへ送られることはありません。
押すと初回だけ約 9MB を読み込みます(2 回目以降はキャッシュされます)。
解いてみる
読んだだけでは書けるようになりません。実行結果で採点します。
関連するトピック
根拠(一次情報)
- PostgreSQL 18 マニュアル: INSERT一次情報・確認 2026-08-13
- PostgreSQL 18 マニュアル: 制約(主キー・外部キー・CHECK)一次情報・確認 2026-08-13