Определите, влияет ли SQL UPDATE на отдельные объединенные таблицы

Согласно 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 ответа

Решение

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

который возвращает 1, если эта таблица была обновлена ​​за последние 30 секунд, или 0, если нет.

Я подчеркиваю, что это приблизительный ответ, потому что запрос, отличный от того, который вы в последний раз выполняли, мог повлиять на эту таблицу. Если бы вы обернули это в транзакцию или блокировку, то вы могли бы использовать это, чтобы фактически ответить на ваш вопрос: со стоимостью блокировки записи для других соединений.

INNER JOIN гарантирует, что вы получите результаты, только если совпадение найдено в обеих таблицах.

Это означает, что если база данных не может соответствовать результату в одной из таблиц, то строка не включается в набор результатов.

Таким образом, количество результатов, возвращаемых из stmt->rowCount(); будет отображать обновления только на обеих таблицах.

Другие вопросы по тегам