レコードを単一のテーブルに挿入する最良の方法を見つけようとしていますが、アイテムがまだ存在しない場合に限ります。この場合の KEY は NVARCHAR(400) フィールドです。この例では、オックスフォード英語辞書の単語の名前であると仮定して、お気に入りの辞書をここに挿入します。また、Word フィールドを主キーにする必要があると思います。(テーブルには一意の識別子 PK も含まれます)。
だから..テーブルに追加する必要があるこれらの単語を取得するかもしれません...
例えば。
- ネコ
- 犬
- フー
- バー
- ピューピュー
- 等...
伝統的に、私は次のことを試します(疑似コード)
SELECT WordID FROM Words WHERE Word = @Word
IF WordID IS NULL OR WordID <= 0
INSERT INTO Words VALUES (@Word)
すなわち。単語が存在しない場合は、挿入します。
今..私が心配している問題は、私たちがたくさんのヒットを取得していることです..そのため、SELECTとINSERTの間に別のプロセスから単語が挿入される可能性があります..その後、制約エラーがスローされます? (つまり、競合状態)。
次に、次のことができるかもしれないと考えました...
INSERT INTO Words (Word)
SELECT @Word
WHERE NOT EXISTS (SELECT WordID FROM Words WHERE Word = @Word)
基本的に、単語が存在しない場合は単語を挿入します。
悪い構文はさておき、これがテーブルをロックダウンする方法(ロックダウンする場合)と、大量の読み取りと大量の書き込みを行うテーブルでのパフォーマンスが低いため、これが悪いか良いかはわかりません。
では、Sqlの専門家は何を考えていますか/何をしますか?
スローされたエラーに対して、単純な挿入と「キャッチ」を行うことを望んでいました。