DATE_ADD () с типом столбца TIME для истечения срока действия записи

0

У меня есть две таблицы: 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.

Теги:

1 ответ

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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню