根据http://us3.php.net/manual/en/pdostatement.rowcount.php:
PDOStatement :: rowCount()返回受影响的行数 最后由相应的DELETE,INSERT或UPDATE语句执行 PDOStatement对象。
使用单个查询,是否可以判断单个JOIN表是否受到影响?例如,根据以下查询,我如何知道t1
是否受到影响以及t2
是否受到影响?
$sql ='UPDATE t1 INNER JOIN t2 ON t2.t1_id=t1.id SET t1.foo=:foo, t2.bar=:bar WHERE t2.id=:id';
$stmt = db::db()->prepare($sql);
$stmt->execute(array('foo'=>123,'bar'=>321,'id'=>10));
$rows_t1=$stmt->rowCount();
$rows_t2=$stmt->rowCount();
答案 0 :(得分:0)
INNER JOIN
确保只有在两个表上找到匹配项时才会获得结果。
这意味着如果数据库无法匹配其中一个表中的结果,则该行不包含在结果集中。
因此,stmt->rowCount();
返回的结果数量仅反映两个表的更新。
答案 1 :(得分:0)
UPDATE_TIME
表中的information_schema.tables
列约回答了“哪个表已更新”的问题。基本示例:
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'database' AND TABLE_NAME = 'table'
如果您在修改语句后立即运行此操作,则可以限制为几秒钟的窗口以检查特定表是否已更新,例如:
SELECT COUNT(*)
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'database' AND TABLE_NAME = 'table'
AND UPDATE_TIME BETWEEN (NOW() - INTERVAL 30 SECOND) AND NOW();
如果该表在过去30秒内更新,则返回1,否则返回0。
我强调这是一个近似的答案,因为除了您上次执行的查询之外的查询可能会影响该表。如果你要将它包装在事务或锁中,那么你可以用它来实际回答你的问题:写锁定其他连接的成本。