it-roy-ru.com

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

У меня есть два столбца в таблицах пользователей, а именно 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?

177
Ibrahim Azhar Armar

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

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

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

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

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

70
wardk

Мое решение

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

EUREKA !!!


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

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

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


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

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

13
Augiwan

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

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

4
Jean Rajotte

В версиях 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();
2
Matteius

Лучше всего использовать "DEFAULT 0" . Другой способ: /************ РОЛЬ ************/ удалить таблицу, если существует role; создать таблицу role ( id_role bigint (20) без знака, не равное null auto_increment, date_created datetime, date_deleted datetime, name varchar (35) не ноль, description текст, primary ключ (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
Lucas Moyano Angelini
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

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

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

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

0
Eagle_Eye

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

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