Подтвердить что ты не робот

Возможно ли создать столбец с UNIX_TIMESTAMP по умолчанию в MySQL?

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

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

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

4b9b3361

Ответ 1

Способ 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, вы можете использовать предложение R. Bemrose и установить его с помощью триггера:

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)

Ответ 2

Из документация:

За одним исключением значение по умолчанию должна быть постоянной; это не может быть функции или выражения. Это означает, например, что вы не можете установить по умолчанию для столбца даты будет значение функции, например NOW() или ТЕКУЩАЯ ДАТА. Исключением является то, что вы можете указать CURRENT_TIMESTAMP как по умолчанию для столбца TIMESTAMP.

Ответ 3

Хорошо, если MySQL не позволит вам сделать это напрямую, вы всегда можете сделать это, используя BEFORE INSERT... FOR EACH ROW trigger.

Ответ 4

Вы можете создать триггеры для этого.

для вставки

  • запрос

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 TRIGGER

Пройдите эти ссылки