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

Posted

技术标签:

【中文标题】插入并返回插入的行数(非重复)和记录 ID(新的或重复的)【英文标题】:Insert and return both number of rows inserted (non-duplicates) and id of record (new or duplicate) 【发布时间】:2012-10-21 14:00:32 【问题描述】:

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

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

在一个查询中我想得到:

    插入行或已存在条目的 id 插入的行数(不计算已存在的重复项)

我最初使用 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】:

我不确定这是否适用于 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

【讨论】:

以上是关于插入并返回插入的行数(非重复)和记录 ID(新的或重复的)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server返回插入数据的ID和受影响的行数

SQL Server返回插入数据的ID和受影响的行数

mysql 处理数据库中的重复行

值总是返回 0,它应该返回插入的行数

mysql不是自动增长的主键怎么利用ibatis返回值判断是不是插入成功

c#如何返回插入行的ID值