SQL:选中时增加行值

时间:2015-08-04 17:01:48

标签: php sql select increment amazon-rds

在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的结果,而不是像我希望的那样实际更改数据库中的值。

3 个答案:

答案 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;