Установить NOW () в качестве значения по умолчанию для типа данных datetime? - PullRequest
186 голосов
/ 28 апреля 2011

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

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

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

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'

Могу ли я установить значение даты и времени по умолчанию в NOW () в MySQL?

Ответы [ 12 ]

228 голосов
/ 28 апреля 2011

Начиная с 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

Ссылка:
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, который автоматически обновляется при каждом изменении записи.К сожалению, однако, только одно автоматически обновляемое поле 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
)
70 голосов
/ 16 ноября 2013

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

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

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

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

42 голосов
/ 25 октября 2012

Мое решение

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
13 голосов
/ 22 июня 2011

EUREKA !!!


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

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

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


Важное обновление :

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

4 голосов
/ 09 сентября 2015

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

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

3 голосов
/ 07 апреля 2017

В версиях 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();
1 голос
/ 19 февраля 2015

Лучший способ - использовать «ПО УМОЛЧАНИЮ 0».Другой способ:

    /************ 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();
1 голос
/ 07 мая 2013
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

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

0 голосов
/ 27 апреля 2018
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

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

0 голосов
/ 28 ноября 2017

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

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