Определите, влияет ли 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();
будет отображать обновления только на обеих таблицах.