2

C# に挿入メソッドがあります。基本的には次のとおりです。ここで、url はテーブル内の一意の制約です。

INSERT INTO pages
(url) VALUES ('http://www.google.com');

単一のクエリで取得したいのは次のとおりです。

  1. 挿入された行またはすでに存在するエントリの ID
  2. 挿入された行数 (既に存在する重複はカウントされません)

私は元々、上記のように ExecuteNonQuery を使用して挿入を呼び出し、MySQL の重複例外をキャッチしていました (INSERT IGNORE を使用することもできましたが、クエリの別の部分が原因で失敗していないことがわかって安心しました)。これにより、実際に挿入された行数の正確な数を取得できましたが、重複の場合に ID を取得する方法は提供されませんでした (行が重複している場合、command.LastInsertedId は -1 を返します)。

次に、ステートメントを次のように変更しました。

INSERT INTO pages
(url) VALUES ('http://www.google.com')
ON DUPLICATE KEY UPDATE id= LAST_INSERT_ID(id);

これにより command.LastInsertedId プロパティが正しく更新されますが、もちろん例外はスローされなくなり、UPDATE catch により ExecuteNonQuery から 1 が返され、行が挿入されているか重複しているかを判断する方法がないように見えます。

できれば単一のステートメントを使用して、.NET (C#) アダプターを使用して、レコードの ID と挿入された行数の両方を決定するための最良のオプションは何ですか?

クエリで影響を受ける行数を設定する方法はありますか? パフォーマンスを大幅に低下させることなく、両方の情報を提供する方法はありますか?

4

1 に答える 1

0

これが mySql で機能するかどうかはわかりませんが、INSERT + SELECT アプローチを使用します。何かのようなもの:

declare @prevID <column type>
select @prevID = id from pages where url = 'http://www.google.com'
if @prevID is null
begin
    insert into pages(url) values ('http://www.google.com')
    select 1, @@identity
end
else
    select 0, @prevID
于 2013-04-04T01:44:31.723 に答える