【SQL】同じ値や同じデータのINSERTはできる?
このページでは、ORACLEデータベースのSQLで、INSERT文を使った同じ値や同じデータの登録について解説していきます。
INSERT文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】INSERT文の書き方:サンプル多数あり
同じ値や同じデータのINSERTは可能です
条件次第ですが、INSERT文で同じ値や同じデータの登録は可能です。
INSERTしたいテーブルに主キー制約などがなければ、全く同じ値の全く同じレコードを登録することもできます。
例えば、次のようなテーブルを作成します。
CREATE TABLE tab1(
col1 varchar2(5)
,col2 varchar2(10)
);
そして同じ値を指定したデータをINSERTします。
主キー制約がないテーブルなので、同じ値や同じデータであっても登録が可能です。
SQL> insert into tab1 values('00001','0000000001');
1行が作成されました。
SQL> insert into tab1 values('00001','0000000001');
1行が作成されました。
同じ値や同じデータのINSERTが出来ないケース
テーブルに主キー制約がある場合は、同じ値や同じデータをINSERTすることが出来ません。主キーが重複するためです。
例えば、次のように主キー制約をもつテーブルを作成します。
CREATE TABLE tab1(
col1 varchar2(5)
,col2 varchar2(10)
,PRIMARY KEY(col1,col2)
);
そして、同じ値をセットしたレコードのINSERTを試みると、一意制約エラーとなり、INSERTは失敗します。
SQL> insert into tab1 values('00001','0000000001');
1行が作成されました。
SQL> insert into tab1 values('00001','0000000001');
insert into tab1 values('00001','0000000001')
*
行1でエラーが発生しました。:
ORA-00001: 一意制約(USER1.SYS_C008129)に反しています
登録できないエラーの回避方法
同じ値や同じレコードを登録するとき、エラーとなるのは、先ほどの一意制約エラーです。これを回避する方法はいくつかあります。
例えば、SELECT文を実行し事前に重複行の有無をチェックする方法やNOT EXISTSを駆使する方法です。
これらについては「【SQL】INSERT文で重複を無視・チェック・回避する方法」で詳しく解説していますのでぜひ参考にしてください。
もちろん、主キー制約を外したり、主キーを構成する列を増やすことで回避できることもあります。
まとめ
INSERT文で同じ値や同じデータを登録することは可能です。ただし、主キー制約などがない場合に限ります。
主キー制約がある場合、同じ値や同じデータをINSERTすると、一意制約エラーとなりINSERTに失敗します。
この他にもINSERT文の様々な書き方を解説しております。
詳しくは「【SQL】INSERT文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。