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