Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 每个用户只保留10条记录_Php_Mysql - Fatal编程技术网

Php 每个用户只保留10条记录

Php 每个用户只保留10条记录,php,mysql,Php,Mysql,我在我的网站上运行points系统,所以我需要将用户不同操作的日志保存到数据库中。问题是我有太多的用户,永久保存所有记录可能会导致服务器过载。。。有没有办法让每个用户只保留10条记录并自动删除旧条目?mysql对此有什么功能吗 提前感谢只需运行每小时一次的cron作业,删除第11-n条记录。在插入记录之前,您可以先检查用户有多少条记录。如果大于等于10,则删除最旧的一个。然后插入新的 DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM

我在我的网站上运行points系统,所以我需要将用户不同操作的日志保存到数据库中。问题是我有太多的用户,永久保存所有记录可能会导致服务器过载。。。有没有办法让每个用户只保留10条记录并自动删除旧条目?mysql对此有什么功能吗


提前感谢

只需运行每小时一次的cron作业,删除第11-n条记录。

在插入记录之前,您可以先检查用户有多少条记录。如果大于等于10,则删除最旧的一个。然后插入新的

DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table WHERE USER_ID = 1) AND USER_ID = 1
更清晰的版本

DELETE FROM Table
    WHERE ID NOT IN
    (
        SELECT TOP 10 ID  FROM Table WHERE USER_ID = 1
    )
    AND USER_ID = 1

为用户插入新记录时。之前只需执行类似的查询,不要忘记where条件:

DELETE FROM tablename WHERE userID = 'currentUserId' LIMIT 9, 999999
之后,您可以插入新数据。这将使每个用户的数据始终保持在10条记录

INSERT INTO tablename VALUES(....)

如果您的目标是让数据库确保给定表中每个给定子键用户的行数不超过N行,那么解决此问题的正确方法是:

用于管理表中的插入。 在插入后使用删除旧的行。 如果您已经在使用存储过程进行数据访问,那么修改insert过程最有意义,否则触发器将是最简单的解决方案


或者,如果您的目标是定期删除旧数据,那么使用cron作业启动存储过程来删除旧数据将最有意义。

您可以添加一个触发器,负责删除旧条目。 比如说,

DELIMITER //
CREATE definer='root'@'localhost' TRIGGER afterMytableInsert AFTER INSERT ON MyTable
FOR EACH ROW
BEGIN
    DELETE FROM MyTable WHERE user_id = NEW.user_id AND id NOT IN 
    (SELECT id FROM MyTable WHERE user_id = NEW.user_id ORDER BY action_time DESC LIMIT 10);
END//

你怎么知道它超载了?症状是什么?在决定解决方案之前,你应该收集一些关于这方面的统计数据。我很好奇,你大概有多少用户?我的公司在一个超过400万的记录文件上取得了巨大成功。我有MySQL 5.7.14,无法创建这样的触发器-我收到以下错误:错误代码:1235。这个版本的MySQL还不支持“LIMIT&IN/ALL/ANY/SOME subquery”OK,为了避免触发器中的这个限制,我可以做一个类似于DELETE FROM MyTable的语句,其中user_id=NEW.user_id和id不在SELECT id FROM MyTable中,其中user_id=NEW.user_id按操作排序\u time DESC LIMIT 10 foo;但是当我无法将记录插入MyTable时,我得到了以下响应错误代码:1442。无法更新存储函数/触发器中的表“MyTable”,因为调用此存储函数/触发器的语句已经使用了该表。@sbrbot:那么最简单的方法可能是使用某种内置或外部的计划程序,如cron。我还建议创建一个新问题,因为Mysql从8年前到现在已经发展了相当长一段时间。