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



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




  1. установите значение по умолчанию registerDate для MySQL NOW ()

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


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



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?

520   12  

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

Comments

    Ничего не найдено.