2011-04-12 57 views
2

我有一个带有一个主键的MySQL表。mysql_affected_rows()在'真实'上返回1 REPLACE INTO

每晚我运行一项作业插入和更新记录。我为每个操作使用REPLACE INTO,所以它会添加或替换现有的行。

REPLACE INTO查询之后,我打电话给mysql_affected_rows(),它对于实际被替换的许多行返回的计数为1,而不是'new'(对于绝大多数被替换的行返回2)。

我知道这些“插入”中的一些是错误的,因为我跟踪批量更新开始和结束时的行数;该表没有重复的数据,加上我已验证批量更新之前存在的假'新'行。

这张表没有什么特别的地方;类似的表的工作原理与使用相同的代码一样。任何人有任何想法为什么mysql_affected_rows()返回1为一个真正的替代而不是插入的操作?

回答

2

REPLACE INTO实际上执行DELETE,然后是INSERT,而不是UPDATE。

您可能需要考虑使用INSERT ... ON DUPLICATE KEY UPDATE语法。

+0

我知道,如果行已经存在,那么REPLACE会执行删除/插入操作,这就是我难倒了 - 为什么mysql_affected_rows()返回1时,显然应该返回2?正如我所提到的,这段代码在一个相同的表上工作,所以我迷失了,试图找出为什么mysql_affected_rows()返回1. 我可以使用ON DUPLICATE,但会需要所有的列和值标签两次 - 一次用于INSERT INTO&for ON DUPLICATE。有600多列,这是很多。我可以计算列之间的变化,但这需要做一个SELECT,从而在第一个地方击败了使用REPLACE的点。 – 2011-04-13 16:51:54