Выберите последние затронутые строки

Я обновил свои записи на основе определенного условия, после чего я хочу узнать идентификаторы из затронутых строк.

$sql = mysqli_query("update table set xxx='".$x."' where yyy='".$y."'");

Теперь после выполнения этого запроса я хочу знать затронутые строки.

4 ответа

Простой, но эффективный

$last_id = mysqli_insert_id($conn);

http://www.w3schools.com/php/php_mysql_insert_lastid.asp


UPDATE users
SET type = '3'
WHERE type = '2';

Чтобы узнать последнюю затронутую строку сразу после инструкции, она должна быть слегка обновлена ​​следующим образом:

UPDATE users
SET type = '3',
 user_id=LAST_INSERT_ID(user_id)
WHERE type = '2';

//использовать функцию

function updateAndGetId($value)
 {
 $query ="UPDATE users
 SET type = '$value',
 user_id=LAST_INSERT_ID(user_id)
 WHERE type = '2'";
 mysql_query($query)
 return mysql_insert_id();
 }
 $lastUpdatedRow = updateAndGetId(3);

Если вы хотите обновить только реально измененную строку, добавьте условное обновление user_id через LAST_INSERT_ID и проверьте, будут ли данные изменяться в строке.


Единственный способ, с помощью которого я могу думать, - сначала скрыть строки, которые будут обновляться с помощью инструкции обновления:

$updatableIds = mysqli_query("SELECT id FROM table WHERE xxx !='".$x."' AND yyy='".$y."'");

добавим xxx !='".$x."', потому что если значение xxx уже было $x, эти строки не пострадали.

Затем вы запустите обновление

$sql = mysqli_query("update table set xxx='".$x."' where yyy='".$y."'");


Сначала вы должны получить идентификаторы, а затем выполнить обновление. Если проблема concurrency, вы можете использовать блокировку чтения (при условии, что ваша таблица хранится в транзакционном движке, таком как InnoDB):

$mysqli->autocommit(FALSE);
$select = $mysqli->prepare('SELECT id FROM table WHERE yyy = ? FOR UPDATE');
$select->bind_param('s', $y);
$select->execute();
$update = $mysqli->prepare('UPDATE table SET xxx = ? WHERE yyy = ?');
$update->bind_param('ss', $x, $y);
$update->execute();
$mysqli->commit();
// here are the IDs that were updated
$select->bind_result($id);
while ($select->fetch()) printf('Updated id: %s\n', $id);

licensed under cc by-sa 3.0 with attribution.