このページでは、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文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。