Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定SQL更新是否影响单个联接表_Php_Mysql_Rows Affected - Fatal编程技术网

Php 确定SQL更新是否影响单个联接表

Php 确定SQL更新是否影响单个联接表,php,mysql,rows-affected,Php,Mysql,Rows Affected,根据: PDOStatement::rowCount()返回受 由相应的 PDO语句对象 使用单个查询,是否可以判断单个联接表是否受到影响?例如,给定以下查询,我如何知道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->exe

根据:

PDOStatement::rowCount()返回受 由相应的 PDO语句对象

使用单个查询,是否可以判断单个联接表是否受到影响?例如,给定以下查询,我如何知道
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();

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

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


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

信息架构中的
更新时间
列。表
表大致回答了“哪个表已更新”的问题。基本示例:

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


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

这个问题与PDO无关,因为PDO不会处理您的查询。如果可以返回任何类似的内容,您需要查阅mysql手册。(不,据我所知。)@YourCommonSense那么应该永远不要使用
pdostatement.rowcount()
?也许是一个非PHP的解决方案?谢谢如果两个表中以前的值恰好与新提供的值相同,该怎么办?
内部联接
其中
将选择要更新的记录,但是,这些记录不会受到影响。是的,如果表中的值与update语句中的值相同,则该行不会被视为受影响。但是,如果只有一个表中的值不同,该怎么办?然后,我想知道该表是否受到影响,而不是查询是否总体上影响了数据库。如果您在更新大量记录时使用内部联接来提高性能,请查看以下内容:,但如果您只更新少量记录,则使用多个update语句不会降低性能。谢谢。也许两个问题是最好的选择。谢谢主教。是的,这似乎可行。我对杂草有点怀疑。这个解决方案很有可能在今天起作用,但在将来的MySQL版本上停止工作吗?对于将来的版本,我的直觉说这个方法仍然有效。如果您想继续并防范将来的更改,请将上述逻辑包装在一个过程中(创建过程pTableLastUpdate RETURNS DATETIME),在代码中使用该过程(调用pTableLastUpdate('db','tab')),然后根据需要交换实现。例如:另一种实现是在表上放置INSERT、UPDATE、DELETE触发器,并让这些触发器更新您自己的“Last_Updated_on”表,您的过程可以从中读取。是的,触发器也可以工作。我总是挣扎在何时使用它们的问题上,因为这会使应用程序失去逻辑。用哑方法进行初始选择并使用应用程序检查值怎么样?如果是这样,您会将所有旧值放在WHERE中还是在应用程序中执行?ThanksRe:triggers,尽可能地集中业务逻辑——如果应用程序代码中有这样的逻辑,就把它留在那里。我将触发器的使用限制在数据库内部管理/内部,而不是任何业务逻辑。例如:具体化视图、更新计数器、清理临时值等。在不了解您的用例的情况下,我无法对SELECT pre check方法提出任何真正的要求,但一般来说,它听起来像是大量的往返和处理,将净减少您的QPS——因此,一般来说,我会选择不同的方法。