У меня есть две таблицы: 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;
Я хочу DELETE
USER_KEY, как только CREATE_DATE плюс KEY_TYPE.expiration больше, чем NOW()
. Я собираюсь создать мероприятие для достижения этого (предполагая, что это лучшая практика?). Однако я не могу понять, как правильно добавить столбец истечения времени типа данных в столбец CREATE_DATE. Я думаю, что я рядом, но DATE_ADD
добавляет более 24 часов, например, в CREATE_DATE. Пока мой запрос выглядит следующим образом:
SELECT USER_KEY.create_date, KEY_TYPE.expiration,
DATE_ADD(USER_KEY.create_date, INTERVAL KEY_TYPE.expiration SECOND) CREATE_PLUS_EXPIRATION
FROM USER_KEY
JOIN KEY_TYPE ON USER_KEY.key_type_id = KEY_TYPE.id;
В следующем примере я играл в DB Fiddle.
Спасибо, @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();