どうも!ひよこSE(@PiyoOct)です。
INSERT INTO VALUESにカラム名を指定する場合、省略する場合の違いについて早速、結論。
- カラム名を指定した場合:DBのカラム数(列数)と、値の個数が一致しなくてもエラーにならない
※VALUEを指定しなかったカラムについて、カラムの初期値(だいたいNULLのはず)になる。NOT NULL制約がない前提でOKになる - カラム名を省略する場合:DBのカラム数(列数)と、値の個数が一致していないければエラー
うまく伝わる表現かは微妙ですが、「値の個数」というキーワードから、何言いたいか察してください。このあとは、あれこれ書いていくので適当に詳細、必要な説明を拾っていってくださいまし。
INSERT INTO VALUESにカラム名を指定する場合は、値の個数は不問
“EMPLOYEE(従業員テーブル)”というテーブルあったとします。(第二正規化以降の概念はここでは考えないものとします。それと、Oracleっぽく書きますが、あまり深く考えてないので間違ってたら空気読んでください)
◆EMPLOYEEの定義
No | 物理名 | 論理名 | 型・桁 | 必須(NOT NULL制約) | 初期値 |
---|---|---|---|---|---|
1 | EMPLOYEE_ID | 従業員ID | NUMBER(10) | Yes(PK) ※主キー | |
2 | EMPLOYEE_NAME | 従業員名 | VARCHAR2(50) | Yes | |
3 | DEPARTMENT_ID | 部署ID | NUMBER(4) | ||
4 | ENTRY_YMD | 入社日 | VARCHAR2(8) | ||
5 | PROGRAM_ID | 登録プログラム | VARCHAR2(8) | ||
6 | UPD_DT | 更新日時 | date |

各カラムの初期値は、何もしなければNULLです!
余談ですが、PostgreSQLで初期値を空白に設定するプロジェクトに出くわしましたが、まぁ・・・大変でした。(PostgreSQLでは、NULLと空白は区別される。開発途中のテストでNOT NULL制約で落ちてほしい箇所が落ちなくなるから変に処理が続行されるという悪魔)
カラムを指定すれば、NOT NULL制約がない前提で値を省略してもOK
NOT NULL制約がない前提で、カラムを指定すればVALUES以下(値)を省略してもOKなので、次の場合はOKです。
INSERT INTO EMPLOYEE
(EMPLOYEE_ID, EMPLOYEE_NAME)
VALUES
(2025000001, ‘山田 太郎’)
;
NOT NULL制約がある、EMPLOYEE_ID に 2025000001、EMPLOYEE_NAME に 山田 太郎 が設定されるので問題なし。
カラムを指定しなかった DEPARTMENT_ID~UPD_DT の値は、NULLで登録されます。
NOT NULL制約がある箇所の値を省略すると、エラーになる
賢い人なら「当然だよ!」と思うかもですが、NOT NULL制約がある箇所の値を省略すると、エラーになります。
INSERT INTO EMPLOYEE
(EMPLOYEE_ID, DEPARTMENT_ID, ENTRY_YMD, PROGRAM_ID, UPD_DT)
VALUES
(2025000002, ‘1002’, ‘20250401’, ‘PIYOET001’, sysdate)
;
EMPLOYEE_NAMEの値が省略されているので、NULLになります。ということは、EMPLOYEE_NAMEの NOT NULL制約に引っかかってしまうので、この場合はINSERTに失敗します。
INSERT INTO VALUESにカラム名を省略する場合は、カラム数と値の個数が一致しないとエラー
INSERT INTO VALUESにカラム名を指定しない場合は、カラム数と値の個数が一致しないとエラーになります。
NOT NULL制約とか関係なく、カラム数と値の個数は一致している必要がある
つまり、次のような場合しかOKになりません。
INSERT INTO EMPLOYEE
VALUES
(2025000003, ‘佐藤 一郎’, ‘1003’, ‘20250401’, ‘PIYOET001’, sysdate)
;
テーブルのカラム数が5であれば、値の個数も5である必要があります。
値の個数が違えばエラー
値の個数が違えばエラー。NOT NULL制約云々は関係なく、エラーです。
INSERT INTO EMPLOYEE
VALUES
(2025000004, ‘鈴木 二郎’)
;

どのカラムをNULL(初期値)にするかがわからないので、当然ですね・・・
カラムを省略するなら、順番も守る必要ある
もっと言うと、カラムの順番通りに値を設定してあげる必要があります。
INSERT INTO EMPLOYEE
VALUES
(2025000003, ‘佐藤 一郎’, ‘1003’, ‘20250401’, sysdate, ‘PIYOET001’)
;
惜しくも(?)登録プログラムと更新日時の順番が一致していないので、この場合も型が合わずにエラー。
お同士、たまたま型桁が同じでSQL的には通ってしまうこともあるので、必ずINSERTの結果は見るようにしてください。(これに限らず、INSERTの結果は常に確認したほうがいいけど)
将来的にテーブル構造が変わるなら、ひとまずカラム名指定にしておく
たぶんこの記事を読んでいるのは、学生または、仕様変更でカラムを追加するようなテーブル定義を変更しようとしている担当者かと。
将来的にテーブル構造が変わるなら、INSERT文は、ひとまずカラム名指定にしておくべきです。守られていなかったら、実装者に対して静かなる怒りを抱いてください(汗)。
テーブル定義変えたら使用箇所すべてのテストは必要だとは思うけど、カラムに項目を新規追加するってなったときに、INSERT文のカラム名が省略されていると、必ずエラーになって修正確定ですからね・・・。
たまたま、NULLでよい機能も修正が発生することになります。そうなったら、業務上の修正ポイントはないけど、システム上修正が必要なんです(-_-;)って、正直に言うしかない。
まとめ
長々と書きましたが、もう一度まとめます。
- カラム名を指定した場合:DBのカラム数(列数)と、値の個数が一致しなくてもエラーにならない
※VALUEを指定しなかったカラムについて、カラムの初期値(だいたいNULLのはず)になる。NOT NULL制約がない前提でOKになる - カラム名を指定しない場合:DBのカラム数(列数)と、値の個数が一致していないければエラー
INSERTのカラム名を省略すると、個人的には何かと面倒だと思うので、特段の事情がない限りはカラム名指定しておいたほうが、後々楽だと思います!
コメント