В Amazon RDS у меня есть таблица, source
в форме
id | name | times_shown
------------------------
0 | matt | 0
1 | jeff | 0
2 | jake | 0
. | ... | .
. | ... | .
. | ... | .
У меня есть запрос SQL, который случайным образом выбирает строку из этой таблицы
SELECT * FROM source ORDER BY RAND() LIMIT 1;
Есть ли способ для меня изменить этот запрос так, чтобы при выборе строки он также вызывал значение times_shown
столбец для увеличения? Если нет, то есть ли какой-нибудь другой способ, может быть, скрытый тип столбца или настройка драйвера PHP SQL PDO, который позволил бы мне сделать это?
Из моего понимания, этот ТАК вопрос что-то похожее — об изменении результатов SELECT, а не об изменении значения в БД, как я надеюсь сделать.
Что такое RDMS? Если MySQL, вероятно, нужно сделать в две части, измените SELECT
в SELECT ... FOR UPDATE
а затем отдельно обновить times_shown
поле
Взгляни на: https://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
И пример там:
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;
Нет. Нет волшебной функциональности, которая позволяет обновлять строку при ее выборе. Вам нужно будет обновить строку после выбора.
Я знаю, что на этот вопрос был дан ответ довольно давно, но я просто хотел добавить, что с PostgreSQL (вы не сказали, какую СУБД вы используете) вы можете сделать это за один шаг, используя выражение Common Table Expression:
with updated_values as (
update source set times_shown = times_shown + 1
where id in (select id from sources order by random() limit 1)
returning id, name, times_shown
)
select * from updated_values;