删除旧行 MySQL 触发器 - 初学者
Posted
技术标签:
【中文标题】删除旧行 MySQL 触发器 - 初学者【英文标题】:Delete old rows MySQL Trigger - beginner 【发布时间】:2016-01-18 13:43:46 【问题描述】:我正在寻找一种从我的 mysql 表中删除旧行的方法,但我并没有真正理解我发现的问题和答案,所以我希望有人能澄清一下。我在我的表中添加了一个 Timestamp 列,我在其中存储了该行的创建日期。如果该行超过四个月,我不想删除它。我已经研究过触发器,但如果我理解正确,插入触发器只允许您使用插入的行?也许我错了,但我对触发器很陌生,甚至不明白何时/如何运行它们?只运行一次就够了吗,每次有人插入东西时会自动重复该动作吗(如果是插入触发器)?
我经常运行我的 insertQuery,每次有人请求他们绘画的 URL 时。我正在使用 php,我的表格结构如下:
DatabaseID || theKey || Timestamp
1 abcd 2016-01-02
2 a1bc 2016-01-03
3 a1sb 2016-01-03
4 a12b 2016-01-05
编辑:忘了提一下,我希望自动删除旧行并且每周至少运行一次。
【问题讨论】:
Delete all rows with timestamp older than x days的可能重复 旁注:如果Key
是您的实际列名,那是MySQL (R)
的保留字,因此您需要对其进行特殊处理。 dev.mysql.com/doc/refman/5.5/en/keywords.html
“忘了说,我希望自动删除旧行,并且每周至少运行一次。” - 使用 cron 作业。
触发器是执行由数据修改事件触发的偏移操作。保持表中旧条目的清洁并不能真正做到这一点,而且触发器不能修改表中其他记录中的数据。我会创建一个维护脚本(一个简单的删除,如果你想完全删除记录)并使用操作系统级别的调度程序或mysql自己的调度程序来安排它的执行。
@Fred-ii- 我的错误,我将其命名为 theKey 以避免混淆
【参考方案1】:
最好有一个mysql事件调度器http://dev.mysql.com/doc/refman/5.7/en/create-event.html
作为第一步,您需要将调度程序激活为
SET GLOBAL event_scheduler = ON;
请注意,如果服务器重新启动,则需要重置 上面所以最好在 [mysqld] 下的某处设置 event_scheduler=on 默认mysql配置文件中的部分,通常是/etc/my.cnf,make 一定要重启mysql服务器
一旦调度器设置好后,运行下面看看它是否工作,你应该看到一些东西
show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
最后在终端上把调度器写成
delimiter //
create event if not exists clean_old_records
on schedule every 1 week
do
begin
delete from your_table_name
where
Timestamp < date_sub(curdate(),interval 1 month) ;
end; //
delimiter ;
在上面的示例中,它将删除超过一个月的记录,您可以拥有自己的值。
【讨论】:
谢谢,看起来不错!但是我找不到任何 .cnf 文件(我一开始没有实现 MySQL 的使用)而且我没有使用 Ubuntu... 您使用的是哪个操作系统? 我使用的是 Windows 7! 在此处查看 Windows 选项dev.mysql.com/doc/refman/5.7/en/option-files.html以上是关于删除旧行 MySQL 触发器 - 初学者的主要内容,如果未能解决你的问题,请参考以下文章
零点起飞学MySQL 带书签完整pdf版[85.8MB] 完整版下载