MySQL - 每次选择行时更新视图列

时间:2009-06-18 17:23:33

标签: mysql triggers

我有一个包含“view_count”列的表。

我想在每次选择行时递增所述列(即使使用泛型SELECT,例如SELECT * FROM table WHERE 1 ..这会使所有行的view_count增加1。)

有没有办法自动“服务器端”(其中mysql是服务器而我的应用程序是客户端),即每次都没有更新?

编辑:由于有几个人问我为什么要这样做,有些人误解了我的要求,想象一下这是一个论坛软件,而这个表就是线程表。每个线程都有一个视图计数,并且每次在主页面中显示线程时都要更新它(我知道线程的视图计数通常仅在您实际查看时更新,但这是我可以提出的最佳示例我的具体案例有点长而复杂T_T)

5 个答案:

答案 0 :(得分:6)

无法完成。您基本上需要SELECT上的trigger,并且只有INSERTUPDATEDELETE支持触发器。您可以获得的最接近的是通过存储过程运行与表的所有交互,听起来您希望在所有条件下强制执行此行为。

答案 1 :(得分:1)

为什么不像这样发出一个SQL语句:

UPDATE tableName SET viewCount = viewCount + 1; SELECT tableName.col1, tableName.col2;

甚至可以使用任何语言轻松动态创建。

答案 2 :(得分:0)

您可以在会话范围内执行此操作:

SET @view_count := 0;

SELECT  v.*,
        @view_count := @view_count + 1 AS view_count
FROM    view

您查看的每一行都有一个递增值:

SELECT  q.*,
        @view_count := @view_count + 1 AS view_count
FROM    (
        SELECT  1 AS col
        UNION ALL
        SELECT  2 AS col
        ) q;

-- -- 
 1  1
 2  2

SELECT  q.*,
        @view_count := @view_count + 1 AS view_count
FROM    (
        SELECT  1 AS col
        UNION ALL
        SELECT  2 AS col
        ) q;

-- -- 
 1  3
 2  4

但是,这只会计算会话中的观看次数,而不是总观看次数。

答案 3 :(得分:0)

我不相信有一个简单的方法来做这个服务器端;触发器仅在UPDATE,INSERT和DELETE上执行。

答案 4 :(得分:0)

存储过程,但这很痛苦。我会在其他地方实施安全性。