在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驱动程序设置,让我这样做?
根据我的理解,this SO question提出类似的问题是关于改变SELECT的结果,而不是像我希望的那样实际更改数据库中的值。
答案 0 :(得分:1)
什么是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;
答案 1 :(得分:1)
没有。没有神奇的功能允许您在选择行时更新行。选择完成后,您需要更新行。
答案 2 :(得分:1)
我知道很久以前就回答了这个问题,但是只想在PostgreSQL中添加它(你没有说你使用的是哪个RDBMS)你可以使用公用表表达式一步完成:
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;