【发布时间】:2014-04-16 10:45:12
【问题描述】:
我正在尝试辨别 replace into 查询是否导致直接写入,或者先删除然后写入。
The MySQL docs say 在前者的情况下,受影响的行数应该返回 1,或者在后者的情况下应该大于 1:
受影响的行数可以很容易地确定是否 REPLACE 只添加了一行或是否也替换了任何行:检查是否 计数为 1(添加)或更大(替换)。
然而,对我来说,通过 PHP 和 MySQLI 执行此操作,该值始终为 1,无论我的查询是直接写入还是先删除然后写入。
我有一个表“foo”,其中有一列:一个 varchar,它也是主键。所以一开始它是空的。我跑:
$sql = "REPLACE INTO foo VALUES('bar');"
$db->query($sql); //$db is an instantiated and working MySQLI instance
echo $db->affected_rows;
这给了我“1” - 很公平,这是一个直截了当的写法。但是,如果我再次运行相同的查询,它应该给我“2”,对吧?首先删除该行,然后重新插入它,因为主键是相同的。因此,有 2 行受影响。
顺便说一句,我已经尝试过使用基本查询和准备好的语句,即
$sql = "REPLACE INTO foo VALUES(?)";
$stmt = $db->prepare($sql);
$bar = "bar";
$stmt->bind_param('s', $bar);
$stmt->execute();
echo $stmt->affected_rows; //still 1
有什么想法!?
【问题讨论】: