У меня есть два столбца в пользователях таблицы, а именно registerDate and lastVisitDate
, которые состоят из типа данных datetime. Я хотел бы сделать следующее.
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?
Начиная с 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
)
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;
как явный пример в вопросе.
Я использую триггер в качестве обходного пути для установки поля datetime в NOW() для новых вставок:
CREATE TRIGGER `triggername` BEFORE INSERT ON `tablename`
FOR EACH ROW
SET NEW.datetimefield = NOW()
он тоже должен работать для обновлений
Ответы Йохана и Леонардо включают преобразование в поле метки времени. Хотя это, вероятно, хорошо для случая использования, представленного в вопросе (хранения RegisterDate и LastVisitDate), это не универсальное решение. См. Вопрос datetime vs timestamp.
use a timestamp
, и use a timestamp
- глупый обходной путь, если вы действительно узнаете разницу между этими двумя типами данных.
Мое решение
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
TIMESTAMP
. Никто не просил 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
В версиях 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();
Лучший способ - создать триггер:
/************ 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();
`ALTER TABLE `table_name` CHANGE `column_name`
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
Может использоваться для обновления метки времени при обновлении.
ALTER TABLE table_name
CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
Наконец, это сработало для меня!
Это сработало для меня - просто изменил INSERT на UPDATE для моей таблицы.
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Это сработало для меня, используя MySQL:
ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
Не уверен, что он все еще активен, но здесь идет.
Относительно установки значений по умолчанию на Now(), я не вижу, чтобы это было возможно для типа данных DATETIME. Если вы хотите использовать этот тип данных, установите дату, когда вы выполните такую вставку:
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Моя версия mySQL 5.5
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP
. Вы не определилиdata type
данных поля в обеих ваших попыткахDATE
должен работать со значением по умолчаниюNOW()