2017-12-27 10 views
1

selectからデータを挿入するときに重複した主キーエラーを無視する方法はありますか?selectステートメントからの挿入でエラーを無視するSQL

説明 は、私はこのクエリがあるとしましょう:Insert into my_table values (select * from my_second_table)しかしmy_tableidに主キーを持っています。またmy_second_tableにはidという列があります。挿入を試みると、重複した主キーエラーが発生します。

私はgoを使ってこのような問題を避けることができると知っていますが、このケースでは選択からの挿入であるか、少なくとも私が知っているからです。

私にできることはありますか?

+0

この場合、merge文を使用 –

+1

使用しているRDBMSは何ですか?もしあなたが 'ignore_dup_key = on'を見ることができるならば、 –

+0

@MartinSmith私はMsSqlを使っています –

答えて

2

データベースによって、競合の解決方法が異なります。ほとんどのデータベースで、次の作品:

Insert into my_table values (. . .) -- you should always list all the columns 
    select . . . -- you should list all the columns 
    from my_second_table t2 
    where not exists (select 1 from my_table t where t.id = t2.id); 

レースコンディションが問題を引き起こす可能性があるため、これは、完璧なソリューションではありません。しかし、これが実行されている間にサーバー上で実行される他のデータ変更クエリがない場合は、動作します。

+0

ニース、私はそのようなことをすることを考えました。問題は、アクションを実行するにはあまりにも多くの時間とリソースを消費しますが、私は試してみるつもりです。 –

+0

@LuisfelipeDejesusMunoz。 。 。 'my_table(id)'のインデックスが必要です。 –

+0

実際に私は例としてidを使用しました。私の本当の主キーは5列のクラスター化されたキーであり、既にインデックスといくつかのクラスタード・インデックスがテーブルにあります –

関連する問題