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

177

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

  • Установить значение по умолчанию для registerDate для MySQL NOW()
  • Установите значение 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'

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

  • 3
    ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP . Вы не определили data type данных поля в обеих ваших попытках
  • 3
    Поскольку MySQL 5.6 DATE должен работать со значением по умолчанию NOW()
Показать ещё 2 комментария
Теги:
datetime
mysql-error-1067

12 ответов

197
Лучший ответ

Начиная с 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
)
  • 79
    Я действительно не хочу использовать метку времени.
  • 0
    @ibrahim, почему бы и нет ?, вы заявляете, что ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP; как явный пример в вопросе.
Показать ещё 8 комментариев
72

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

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

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

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

  • 0
    работает отлично! Спасибо
  • 4
    Это должен быть принятый ответ, но, в частности, вы должны отредактировать его, чтобы было очевидно, что оно относится к полю даты и времени. Оригинальный плакат хочет знать, как решить его для поля даты и use a timestamp , и use a timestamp - глупый обходной путь, если вы действительно узнаете разницу между этими двумя типами данных.
Показать ещё 2 комментария
43

Мое решение

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
  • 0
    Это определение работает, я рекомендую всем использовать SQLYog или подобный инструмент, он позволяет вам делать это с простым интерфейсом.
  • 27
    Это все еще решение для столбца TIMESTAMP . Никто не просил TIMESTAMP ...
Показать ещё 2 комментария
13

EUREKA!!!


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

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

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


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

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

  • 0
    очень полезно для меня .. :)
  • 0
    Рад, что смог помочь! : D
Показать ещё 11 комментариев
4

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

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

  • 0
    Именно с 5.6.5, потому что у меня 5.6.22, и он не работает, если он 5.6. Жаль.
1

В версиях 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

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

/************ 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
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

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

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

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

0

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

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

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

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

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

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

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

Моя версия mySQL 5.5

  • 6
    Можно упростить как: INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
  • 1
    У вас щедрый донор :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню