2012-11-01 65 views
2

我在C#中有一個插入方法。本質上,下面,其中URL是在表中唯一contraint:插入並返回插入的行數(非重複)和記錄的ID(新的或重複的)

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

在一個單一的查詢我想獲得:

  1. 無論是插入行或條目的ID已經存在
  2. 插入(不包括已存在的重複)

我原先調用插入上述使用的ExecuteNonQuery和捕捉MYS所見的行數QL重複異常(可能使用了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財產,當然不再拋出一個異常,因爲更新漁獲從的ExecuteNonQuery返回1,看似提供沒有辦法確定該行是插入還是重複。

在使用.NET(C#)適配器確定記錄的id和插入行數方面,最好是使用單個語句來確定最佳選擇是什麼?

有沒有一種方法可以設置我的查詢中受影響的行數?有沒有一種方法可以爲我提供兩條信息,而不會有明顯的性能下降?

回答

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