Установить сейчас () в качестве значения по умолчанию для datetime datatype?
у меня есть два столбца в таблице пользователей, а именно registerDate and lastVisitDate, которые состоят из типа данных datetime. Я хотел бы сделать следующее.
- установите значение по умолчанию registerDate для MySQL NOW ()
- установите значение по умолчанию 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?
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_TIMESTAMPReference:
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