我有两个表, KEY_TYPE 和 USER_KEY :
CREATE TABLE `KEY_TYPE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`internal_name` varchar(16) NOT NULL,
`expiration` time NOT NULL DEFAULT '00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_application_internal_name` (`internal_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `USER_KEY` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`uuid` char(36) NOT NULL,
`key_type_id` int(11) NOT NULL,
`CREATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我想{<1>}一个 USER_KEY ,一旦它 CREATE_DATE 加上 KEY_TYPE.expiration 大于DELETE
。我将设置一个 event 来完成此操作(假设这是最佳做法?)。但是,我不知道如何将时间数据类型到期时间列正确添加到 CREATE_DATE 列中。我想我已经接近了,但是NOW()
却将 CREATE_DATE 添加了超过24小时。到目前为止,我的查询如下:
DATE_ADD
我一直在研究DB Fiddle和以下example。
答案 0 :(得分:1)
谢谢@ P.Salmon向我指出了正确的方向。我最终将INTERVAL SECOND
更改为INTERVAL HOUR_SECOND
,这似乎可以解决问题。
这是我最终遇到的事件:
SET GLOBAL event_scheduler = ON;
CREATE EVENT EVENT_EXPIRE_USER_KEYS
ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP
DO
DELETE USER_KEY
FROM USER_KEY
JOIN KEY_TYPE ON USER_KEY.key_type_id = KEY_TYPE.id
WHERE DATE_ADD(USER_KEY.create_date, INTERVAL KEY_TYPE.expiration HOUR_SECOND) < NOW();
但这也可以:
SET GLOBAL event_scheduler = ON;
CREATE EVENT EVENT_EXPIRE_USER_KEYS
ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP
DO
DELETE USER_KEY
FROM USER_KEY
JOIN KEY_TYPE ON USER_KEY.key_type_id = KEY_TYPE.id
WHERE DATE_ADD(USER_KEY.create_date, INTERVAL TIME_TO_SEC(KEY_TYPE.expiration) SECOND) < NOW();