Установить сейчас () в качестве значения по умолчанию для типа данных datetime?

у меня есть два столбца в таблице пользователей, а именно registerDate and lastVisitDate, которые состоят из типа данных datetime. Я хотел бы сделать следующее.

  1. установить значение по умолчанию registerDate в MySQL NOW ()
  2. установите значение по умолчанию lastVisitDate в 0000-00-00 00:00:00 вместо null, который он использует по умолчанию.

поскольку таблица уже существует и имеет существующие записи, я хотел бы использовать Modify table. Я попытался использовать два фрагмента кода ниже, но ни один из них не работает.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

это дает мне ошибку : ERROR 1067 (42000): Invalid default value for 'registerDate'

возможно ли для меня установить значение datetime по умолчанию в NOW() в MySQL?

12 ответов


С MySQL 5.6.5, вы можете использовать DATETIME введите динамическое значение по умолчанию:

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

или даже объединить оба правила:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Reference:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

до 5.6.5, вам нужно использовать TIMESTAMP тип данных, который автоматически обновляется всякий раз, когда запись изменяется. К сожалению, однако, только один auto-updated TIMESTAMP поле может существовать для каждой таблицы.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

см.:http://dev.mysql.com/doc/refman/5.1/en/create-table.html

если вы хотите предотвратить MySQL от обновления значения метки времени на UPDATE (так что он запускается только на INSERT) вы можете изменить определение на:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

Я использую триггер в качестве обходного пути, чтобы установить поле datetime в NOW () для новых вставок:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

он должен работать и для обновлений

ответы Йохана и Леонардо включают преобразование в поле метки времени. Хотя это, вероятно, нормально для варианта использования, представленного в вопросе (хранение RegisterDate и LastVisitDate), это не универсальное решение. См.datetime vs timestamp вопрос.


мое решение

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

Эврика !!!


для всех тех, кто потерял сердце, пытаясь поставить значение DATETIME по умолчанию в MySQL, Я точно знаю, что вы чувствуете / чувствовали. Вот оно:

`ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

внимательно наблюдайте за этим Я не добавил одинарные/двойные кавычки вокруг 0.


важные обновления:

этот ответ был отправлен давно. Тогда это работало на моем (вероятно последняя) установка MySQL, и мне захотелось поделиться ею. Пожалуйста, прочитайте комментарии ниже, прежде чем вы решите использовать это решение.


MySQL 5.6 docs говорят, что CURRENT_TIMESTAMP можно использовать по умолчанию для типов данных TIMESTAMP и DATETIME:

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html


лучший способ сделать триггер:

/************ ROLE ************/
drop table if exists `role`;
create table `role` (
    `id_role` bigint(20) unsigned not null auto_increment,
    `date_created` datetime,
    `date_deleted` datetime,
    `name` varchar(35) not null,
    `description` text,
    primary key (`id_role`)
) comment='';

drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
    on `role`
    for each row 
    set new.`date_created` = now();

в версиях mysql 5.6.5 и новее вы можете использовать точное время и устанавливать значения по умолчанию. Однако есть тонкий бит, который должен передать значение точности как вызову функции datetime, так и вызову функции NOW ().

Этот Пример Работает:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

этот пример не работает:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();

`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

можно использовать для обновления метки времени при обновлении.


это сработало для меня, используя MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();

ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

наконец, это сработало для меня!


Не уверен, что это все еще активно, но здесь идет.

Что касается установки по умолчанию Now(), я не вижу, что это возможно для типа данных DATETIME. Если вы хотите использовать этот тип данных, установите дату при выполнении вставки следующим образом:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

моя версия mySQL - 5.5


это сработало для меня-просто изменил INSERT для обновления для моей таблицы.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))