我有一个包含“view_count”列的表。
我想在每次选择行时递增所述列(即使使用泛型SELECT,例如SELECT * FROM table WHERE 1 ..这会使所有行的view_count增加1。)
有没有办法自动“服务器端”(其中mysql是服务器而我的应用程序是客户端),即每次都没有更新?
编辑:由于有几个人问我为什么要这样做,有些人误解了我的要求,想象一下这是一个论坛软件,而这个表就是线程表。每个线程都有一个视图计数,并且每次在主页面中显示线程时都要更新它(我知道线程的视图计数通常仅在您实际查看时更新,但这是我可以提出的最佳示例我的具体案例有点长而复杂T_T)答案 0 :(得分:6)
无法完成。您基本上需要SELECT
上的trigger,并且只有INSERT
,UPDATE
和DELETE
支持触发器。您可以获得的最接近的是通过存储过程运行与表的所有交互,听起来您希望在所有条件下强制执行此行为。
答案 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)
存储过程,但这很痛苦。我会在其他地方实施安全性。