Можно ли создать столбец с меткой времени UNIX по умолчанию в MySQL?


Я пытаюсь это сделать, но, похоже, MySQL мне не позволяет. Есть ли решение этой проблемы, или я должен всегда включать эту функцию в свои запросы INSERT?

CREATE TABLE foo(
  created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)

Я знаю о типе метки времени, который принимает значение CURRENT_TIMESTAMP по умолчанию, но мой клиент настаивал на использовании времени эпохи в базе данных.

4 23

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 Триггер

Пожалуйста, пройдите по этим ссылкам

  1. Определите некоторые недостатки реализации триггеров sql server

  2. Использование Триггеров