0

根据http://us3.php.net/manual/en/pdostatement.rowcount.php

PDOStatement::rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数。

使用单个查询,是否可以判断单个 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();
4

2 回答 2

0

INNER JOIN确保只有在两个表上都找到匹配项时才能获得结果。

这意味着如果数据库无法匹配其中一个表中的结果,则该行不包含在结果集中。

因此,返回的结果数量stmt->rowCount();将仅反映两个表的更新。

于 2013-12-06T14:30:54.650 回答
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。

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

于 2013-12-06T14:42:08.250 回答