サイトアイコン SE日記

【SQL】INSERTで「値の個数が不足しています」の対処法


このページでは、ORACLEデータベースのSQLで、INSERT文を実行したときに「値の個数が不足しています」というエラーが出る原因と対処方法を紹介しております。

INSERT文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】INSERT文の書き方:サンプル多数あり

「値の個数が不足しています」の原因と対処法

INSERT文で「値の個数が不足しています」というエラーが出る原因を解説します。

「値の個数が不足しています」の原因は、INTOで設定した列の数やデータ型とVALUESに設定した列の数やデータ型と一致していないからです。

では次のようなテーブルに、実際にレコードをINSERTして検証していきます。

create table tab1(
    col1 varchar2(5)
    ,col2 varchar2(10)
    ,col3 date
    ,PRIMARY KEY(col1,col2)
);

VALUESに指定した値の個数が不足しているパターン

正しくINSERTされる実行例です。
次のSQLでは、INTOにCOL1、COL2、COL3を指定し、VALUESでそれぞれ対応するデータ型で値を指定しました。問題なく登録されました。

SQL> insert into tab1(col1,col2,col3) values('00001','0000000001',sysdate);

1行が作成されました。

続いて失敗する例です。
INTOでカラムを3つ指定していますが、VALUESで指定した値が2つです。


この場合、「値の個数が不足しています」というメッセージと共にSQLエラーとなります。

SQL> insert into tab1(col1,col2,col3) values('00001','0000000002');
insert into tab1(col1,col2,col3) values('00001','0000000002')
                                 *
行1でエラーが発生しました。:
ORA-00947: 値の個数が不足しています。

次はINSERTが成功する例です。
先ほどINSERTに失敗したSQLのINTOの後ろの列名を3つから2つに書き換えると、INTOとVALUESの値の個数が一致するのでINSERTが成功します。

INTOの後ろの列名で省略できるものは、主キーではない、もしくはNULLを許容する項目だけです。COL3は主キーでもなく、NULLを許容するので省略できます。

SQL> insert into tab1(col1,col2) values('00001','0000000003');

1行が作成されました。

INTOの後ろの列名を省略したときの起こるパターン

まずはINSERTが失敗する例です。
INTOの後ろの列名を全て省略した場合です。INTOの後ろの列名を省略する場合は、VALUESに全ての列の値が指定されている必要があります。

次のSQLでは、VALUESにCOL3列に対応する値が指定されていないため、SQLエラーとなります。

SQL> insert into tab1 values('00001','0000000004');
insert into tab1 values('00001','0000000004')
            *
行1でエラーが発生しました。:
ORA-00947: 値の個数が不足しています。

次はINSERTが成功する例です。
INTOの後ろの列名を全て省略するとき、VALUESに全ての列に対応する値を指定する必要があります。空でも良い文字はNULLを指定しておきます。

次のSQLでは、先ほどのSQLに加え、VALUESにCOL3列に対応する値が指定されているのでINSERTが成功します。指定する値は対応するデータ型と同じであれば、NULL以外にも固定値や0などを指定することが出来ます。

SQL> insert into tab1 values('00001','0000000005',NULL);

1行が作成されました。

主キー項目の値の指定が不足しているパターン

VALUESに主キー項目に対応する値の数が不足していると、次のように「・・・にはNULLは挿入できません。」とエラーになることがあります。

VALUESに省略された項目にはデフォルトでNULLを設定しようとし、主キー項目なのでNULLは許容できないことでエラーで出ているようです。

「値の個数が不足しています」というエラーではありませんが、VALUESの指定が間違っているので修正が必要です。

SQL> insert into tab1(col1) values('00001');
insert into tab1(col1) values('00001')
*
行1でエラーが発生しました。:
ORA-01400: ("USER1"."TAB1"."COL2")にはNULLは挿入できません。

まとめ

INSERT文を実行したときに「値の個数が不足しています」というエラーが出るパターンは次の3つです。
 ・VALUESに指定した値の個数が不足しているパターン
 ・INTOの後ろの列名を省略したときの起こるパターン
 ・主キー項目の値の指定が不足しているパターン
それぞれ、列名とVALUESに指定する値のデータ型や個数を合わせるとINSERT文は成功します。

この他にも、INSERT文の様々な書き方を解説しております。
詳しくは「【SQL】INSERT文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。

モバイルバージョンを終了