3

「Set」データ構造のような特定のデータベーステーブルを使用しています。つまり、同じ行を複数回挿入することができますが、含まれるインスタンスは1つだけです。主キーは自然キーです。たとえば、次の一連の操作が正常に機能し、オクラホマの行が1つだけになるようにします。

insert into states_visited (state_name) values ('Oklahoma');
insert into states_visited (state_name) values ('Texas');     
insert into states_visited (state_name) values ('Oklahoma');

もちろん、同じ値の後続の挿入で主キーが重複しているため、エラーが発生します。これらのエラーがスローされないように、挿入を条件付きにする方法はありますか?つまり、自然キーがまだ存在しない場合にのみ挿入を行いますか?

where句とサブクエリを実行して、行の存在を最初にテストできることはわかっていますが、コストがかかるようです。これは、1つの論理的な「条件付き挿入」操作に対して2つの物理操作です。SQLでこのようなものはありますか?

参考までに、HSQLDB1.8を使用しています

4

4 に答える 4

2

編集:あなたの質問がこの答えを除外していることに気づきました。いずれの場合も、データベースエンジンは、一意性制約を適用するために、whereチェックを実行する必要があります。

このinsert ... selectステートメントでは、where句を使用できます。

insert into states_visited (state_name) 
select 'Oklahoma'
where not exists
(
    select  * 
    from    states_visited
    where   state_name = 'Oklahoma'
)

ほとんどのSQLデータベースは、トランザクション方式で単一のステートメントを実行します。

于 2010-03-03T21:03:41.547 に答える
0

デュープが飲み込まれることを本当に気にしないのなら、とにかく先に進んで挿入を試みて、例外をキャッチすることはできませんか?

...このコードは頻繁に呼び出されていることを覚えておいてください。これは、上記で説明したcheck-then-insertメソッドよりもパフォーマンスが低い可能性があります。

最後に、いつでも最初の提案を行うことができますが、(そのセッションで)以前に表示された値のメモリにキャッシュを保持します。これにより、例外処理を行うことのパフォーマンスの欠点が制限されます。

于 2010-03-03T20:51:48.207 に答える
0

純粋なSQLでこれを行う方法はありません。タスクには手続き型言語が必要です。たとえば、PL-SQLでは、匿名のPL-SQLブロックを使用できます。

于 2010-03-03T21:18:08.160 に答える
0

MERGEコマンドを使いたいと思います。

ただし、これを行うには、HSQLDB1.9以降を使用する必要があります。

于 2010-03-05T14:45:21.990 に答える