插入并返回插入的行数(非重复)和记录 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(新的或重复的)的主要内容,如果未能解决你的问题,请参考以下文章