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


197

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

  1. Установите значение по умолчанию для registerDate в MySQL NOW ()
  2. Установите значение по умолчанию для lastVisitDate 0000-00-00 00:00:00вместо null, которое используется по умолчанию.

Поскольку таблица уже существует и имеет существующие записи, я хотел бы использовать таблицу 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'

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


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP, Вы не определили data typeполе в обеих ваших попытках
Шакти Сингх,

3
Поскольку MySQL 5.6 DATEдолжен работать со значением по умолчаниюNOW()
AbcAeffchen

Согласно документации mysql 5.6: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , вы можете использовать CURRENT_TIMESTAMP () по умолчанию.
blacktie24

как бы я реализовать CURRENT_TIMESTAMP + 1 день
Ilker Baltaci

Ответы:


241

Начиная с 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
)

80
я действительно не хочу использовать метку времени.
Ибрагим Азар Армар

2
@ Ибрагим: отметка времени - ваш единственный шанс. Если вы используете поле даты и времени, вы должны вставлять запись, используя now () каждый раз.
Никола Коссу

9
Руководство говорит ясно: «Это означает, например, что вы не можете установить по умолчанию для столбца даты значение функции, такой как NOW () или CURRENT_DATE».
Никола Коссу

19
@Johan DATETIMEчасто предпочитают использовать диапазон, который он может содержать: от «1000-01-01 00:00:00» до «9999-12-31 23:59:59» по сравнению с TIMESTAMPS«s» 1970-01-01 00: 00:01 UTC до 2038-01-19 03:14:07 UTC. Для целей хранения дат рождения или, например, более 30 лет в будущем.
user17753

5
@nickrulez Вы больше не ограничены timestampдля этого поведения с MySQL 5.6
Дэн Эспарза

70

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

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

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

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


4
Это должен быть принятый ответ, но, в частности, вы должны отредактировать его, чтобы было очевидно, что оно относится к полю даты и времени. Оригинальный плакат хочет знать, как решить его для поля даты и времени, и use a timestampэто глупый обходной путь, если вы действительно узнаете разницу между этими двумя типами данных.
phpguru

45

Мое решение

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

Это определение работает, я рекомендую всем использовать SQLYog или подобный инструмент, он позволяет вам делать это с простым интерфейсом.
Неизменный кирпич

27
Это все еще решение для TIMESTAMPколонки. Никто не просил TIMESTAMP...
Петр Пеллер

2
Да, это не ответ на вопрос. TIMESTAMP - это другой тип поля для DATETIME.
Джон Хант

@ Леонардо, как я могу отображать только дату
151291

13

EUREKA !!!


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

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

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


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

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


16
Это зависит от ожиданий ... - Это решение позволяет вам иметь поле NOT NULL, так как предоставляется значение по умолчанию. - Это решение не установит для поля значение СЕЙЧАС ().
CodeReaper

10
Это не отвечает на оригинальный вопрос; в ответе должно быть четко указано.
Мэтт Браун

2
Имейте в виду, что режим TRADITIONAL SQL включает в себя NO_ZERO_DATE, поэтому вышеописанное не будет работать в этом случае.
Móż

Судя по предоставленным ответам, звучит так: если вы не пожертвуете DATETIME ради TIMESTAMP, вы должны использовать триггеры.
Крис

1
У этого решения будет немного сумасшедшего apis с "OMG это дата НУЛЯ! Какая НАСТОЯЩАЯ! Мы не можем преобразовать 'this' в java.lang.Date/System.DateTime! OMG! -Crashes-".
Felype


4

В версиях 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
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

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


1

Лучший способ - использовать «ПО УМОЛЧАНИЮ 0». Другой путь:

    /************ 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();

0

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

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

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

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


0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-1

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

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

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

Моя версия MySQL 5,5


7
Можно упростить как:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

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

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.