【问题标题】:SQL: Increment row value when selectedSQL:选中时增加行值
【发布时间】:2015-10-27 04:57:36
【问题描述】:

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

【问题讨论】:

    标签: php sql select increment amazon-rds


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      没有。没有神奇的功能可以让您在选择行时更新它。选择完成后,您需要更新该行。

      【讨论】:

        【解决方案3】:

        我知道这个问题已经回答了很久,但只是想用 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;
        

        【讨论】:

        • 我使用的是 MySQL,但感谢您的回答,我相信将来有人会发现它很有用!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多