SQL:选择时增加行值

SQL: Increment row value when selected

在 Amazon RDS 中,我有一个 table、source,形式为

id | name | times_shown
------------------------
0  | matt | 0
1  | jeff | 0
2  | jake | 0
.  | ...  | .
.  | ...  | .
.  | ...  | .

我有一个 SQL 查询,它从 table

中随机选择一行
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;

没有。没有神奇的功能可以让您在 selecting 时更新行。您需要在 select 完成后更新该行。

我知道这个问题很久以前就有人回答了,但我只是想用 PostgreSQL 添加这个(你没有说你使用的是哪个 RDBMS)你可以使用 Common Table 表达式:

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;