确定SQL UPDATE是否影响单个JOINed表

时间:2013-12-06 14:21:51

标签: php mysql rows-affected

根据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();

2 个答案:

答案 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。

我强调这是一个近似的答案,因为除了您上次执行的查询之外的查询可能会影响该表。如果你要将它包装在事务或锁中,那么你可以用它来实际回答你的问题:写锁定其他连接的成本。