Имя: Пароль:
IT
Админ
MySQL: Как получить id строки если она нашлась но не изменилась при UPDATE?
,
0 D_Pavel
 
01.08.16
10:42
Такая таблица:

id   user   status
1    Вася   1
2    Петя   0
3    Вася   1
4    Петя   1


Такой запрос:

UPDATE tabl SET status = 1
WHERE user = 'Петя' limit 1;
select last_insert_id();

Как получить id строки если она полошла по условиб, но не изменилась при UPDATE?
1 D_Pavel
 
01.08.16
10:43
ЗЫ: В SET забыл указать что есть еще id = LAST_INSERT_ID(id)
2 orefkov
 
01.08.16
10:47
Тут надо для начала СУБД указать.
3 D_Pavel
 
01.08.16
10:48
Сложность задачи в том, что до этого запроса могли быть другие запросы, которые могли повлиять на результат выполнения строки: select last_insert_id();
То есть не понятно, она вернула нужный мне id или какой-то другой.
4 D_Pavel
 
01.08.16
10:48
(2) MySQL из заголовка темы
5 hitodom
 
01.08.16
10:49
сделай селект то апдейта
6 Asmody
 
01.08.16
10:50
(3) В транзакцию завернуть?
7 orefkov
 
01.08.16
10:50
(4)
Каюсь, ступил.
(3)
Сделать так, чтобы строка всегда изменялась. Например, иметь поле version зачастую очень полезно и для других задач. При каждом изменении делать set version = version + 1. Можно даже триггер для этого на апдейт навесить.
8 Ёпрст
 
01.08.16
10:51
(0) посмотреть select row_count()
9 Gary417
 
01.08.16
10:51
(7) <Сделать так, чтобы строка всегда изменялась.>

помоему это не очень правильно при большом количестве запросов
10 D_Pavel
 
01.08.16
10:52
(5) Не пойдет, сразу после селекта другой запрос из другого скрипта может изменить ту же самую строку.

Несколько конкурирующих скриптов забирают из таблицы строки для обработки. Ставят статус 1 чтобы другой скрипт эту строку уже не забрал себе.
11 D_Pavel
 
01.08.16
10:53
(6) Если ничего лучше не придумаю, то остается только так
12 D_Pavel
 
01.08.16
10:55
(7) таблицу придется изменить. нет лишних колонок. Придется добавлять новую
13 mkalimulin
 
01.08.16
10:55
(0) Получи список строк, которые не БУДУТ меняться. ПЕРЕД апдейтом.
14 D_Pavel
 
01.08.16
10:56
(13) зачем?
15 orefkov
 
01.08.16
10:56
(9)
Неправильно апдейтить записи с неизменёнными данными.
А рез человек записи апдейтит, значит, ему именно апдейтить и нужно.
16 mkalimulin
 
01.08.16
10:57
(14) Ты получишь строку, которая подойдет по условию но не будет меняться. Ты же этого хотел, нет?
17 Остап Сулейманович
 
01.08.16
11:00
Я может чего не понял. Но. Нигде не изменяется id. И это правильно. В таком варианте никакого нового id у строки не будет. И чего апдейтили того и имеем. Тем более при условии Лимит = 1. Селект с тем же условием и теми же индексами даст именно ту же строку.
18 hitodom
 
01.08.16
11:17
делай update
where status <> новый статус
19 D_Pavel
 
01.08.16
11:32
Всем спасибо, вроде разобрался