Можно ли создать столбец с меткой времени UNIX по умолчанию в MySQL?
Я пытаюсь это сделать, но, похоже, MySQL мне не позволяет. Есть ли решение этой проблемы, или я должен всегда включать эту функцию в свои запросы INSERT?
CREATE TABLE foo(
created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)
Я знаю о типе метки времени, который принимает значение CURRENT_TIMESTAMP по умолчанию, но мой клиент настаивал на использовании времени эпохи в базе данных.
4 ответа:
Способ, которым MySQL реализует тип данных
TIMESTAMP
, это фактически хранение времени эпохи в базе данных. Поэтому вы можете просто использовать столбецTIMESTAMP
с значением по умолчаниюCURRENT_TIMESTAMP
и применить к немуUNIX_TIMESTAMP()
, Если хотите отобразить его как int:CREATE TABLE foo( created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); insert into foo values (current_Date()),(now()); select unix_timestamp(created) from foo; +-------------------------+ | unix_timestamp(created) | +-------------------------+ | 1300248000 | | 1300306959 | +-------------------------+ 2 rows in set (0.00 sec)
Однако, если вы действительно хотите, чтобы тип данных столбца был
INT
, Вы можете использовать предложение Р. Бемроуза и установить его через триггер:CREATE TABLE foo( created INT NULL ); delimiter $$ create trigger tr_b_ins_foo before insert on foo for each row begin if (new.created is null) then set new.created = unix_timestamp(); end if; end $$ delimiter ; insert into foo values (unix_timestamp(current_Date())), (null); select created from foo; +------------+ | created | +------------+ | 1300248000 | | 1300306995 | +------------+ 2 rows in set (0.00 sec)
Из документации:
За одним исключением, значение по умолчанию должно быть постоянным; оно не может быть постоянным. функция или выражение. Это средство, например, что вы не можете установить по умолчанию столбец даты должен быть следующим: значение функции, такой как NOW () или ТЕКУЩАЯ ДАТА. Исключение состоит в том, что вы можете указать CURRENT_TIMESTAMP как значение по умолчанию для столбца метки времени.
Ну, если MySQL не позволит вам сделать это напрямую, вы всегда можете сделать это с помощью
BEFORE INSERT... FOR EACH ROW
триггер .
Для этого можно создать триггеры.
Для вставки
- запрос
CREATE TRIGGER {trigger_name} BEFORE INSERT ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());
- в этом случае
CREATE TRIGGER my_trigger_name_1 BEFORE INSERT ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());
Для обновления
- запрос
CREATE TRIGGER {trigger_name} BEFORE UPDATE ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());
- в этом случае
CREATE TRIGGER my_trigger_name_2 BEFORE UPDATE ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());
Примечание: я понятия не имею о производительности MYSQL Триггер
Пожалуйста, пройдите по этим ссылкам