在我的测试应用中;当我反复运行此查询时,即使没有更改,我也会获得正行计数。
insert into test (k,v) values ('testkey',123)
on duplicate key update v=values(v);
查询在MySQL控制台和MySQL Workbench中按预期工作。我为第一个插入获得1,为连续调用获得0。
然而,当我尝试使用我的C#测试应用程序时,即使行内没有任何变化,我也总是得到2。
有什么想法吗?我在设置连接时遗漏了什么?
这是我的测试表:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`k` varchar(45) DEFAULT NULL,
`v` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `icol_UNIQUE` (`k`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
这是我的小测试代码:
using (var con = new MySqlConnection("Database=mydb;Data Source=localhost;User Id=root;Password=mypass;CharSet=utf8;"))
{
con.Open();
var cmd = new MySqlCommand("insert into test (k,v) values ('testkey',123) on duplicate key update v=values(v)", con);
var rows = cmd.ExecuteNonQuery();
Console.WriteLine(rows); // rows is always 2
}
注意:
答案 0 :(得分:0)
最后在阅读下面的手册后找到了解决方案 https://downloads.mysql.com/docs/connector-net-en.pdf
有一个名为Use Affected Rows,UseAffectedRows
的连接选项其默认值设置为false。
描述说:
如果为true,则连接报告已更改的行而不是找到的行。 此选项已在Connector / Net版本5.2.6中添加。
使用时;连接到服务器时不设置CLIENT_FOUND_ROWS标志
似乎MySQL Workbench和MySQL命令行在连接期间不使用CLIENT_FOUND_ROWS标志,默认情况下MySql .Net Connector使用它。
来自INSERT ... ON DUPLICATE KEY UPDATE文件 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
如果ON DUPLICATE KEY UPDATE,则每行的受影响行值为1 该行将作为新行插入,如果更新现有行,则为2 如果现有行设置为其当前值,则为0。如果你指定 连接时,CLIENT_FOUND_ROWS标志为mysql_real_connect() mysqld,如果设置了现有行,则受影响的行值为1(不为0) 目前的价值观。
<强>解决方案: 将其添加到连接字符串
Use Affected Rows=true