插入并返回插入的行数(非重复数)和记录的ID数(新的或重复的)

时间:2012-11-01 00:24:32

标签: c# mysql insert insert-update

我在C#中有一个插入方法。基本上如下,其中url是表中唯一的约束:

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

在一个查询中,我想得到:

  1. 插入行或已存在的条目的ID
  2. 插入的行数(不包括已存在的重复项)
  3. 我最初使用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和插入行数的最佳选择是什么?最好用一个语句?

    有没有办法可以设置查询中受影响的行数?有没有一种方法可以为我提供两条信息而不会显着下降?

1 个答案:

答案 0 :(得分: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