Установить сейчас () в качестве значения по умолчанию для типа данных datetime?
у меня есть два столбца в таблице пользователей, а именно registerDate and lastVisitDate
, которые состоят из типа данных datetime. Я хотел бы сделать следующее.
- установить значение по умолчанию registerDate в MySQL NOW ()
- установите значение по умолчанию lastVisitDate в
0000-00-00 00:00:00
вместо null, который он использует по умолчанию.
поскольку таблица уже существует и имеет существующие записи, я хотел бы использовать Modify table. Я попытался использовать два фрагмента кода ниже, но ни один из них не работает.
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_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
тип данных, который автоматически обновляется всякий раз, когда запись изменяется. К сожалению, однако, только один auto-updated 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()))