Как установить значение по умолчанию для столбца MySQL Datetime?

Как установить значение по умолчанию для столбца MySQL Datetime?

В SQL Server это getdate(). Что эквивалентно MySQL? Я использую MySQL 5.x, если это имеет значение.

Я использую CURRENT_TIMESTAMP в моей таблице mysql (не в запросе), возможно, это тоже может быть полезно.

Ruben 15.05.2012 18:48

Эта функция теперь добавлена ​​в MySQL 5.6.5. Надеюсь, это кому-то поможет. optimize-this.blogspot.co.uk/2012/04/…

GhostInTheSecureShell 03.07.2012 18:29

@GhostInTheSecureShell - миссия по его установке, по крайней мере, на Debian, но определенно отличная функция. Я думаю, что со временем все эти "два вопроса CURRENT_TIMESTAMP" будут сняты!

Marc DiMillo 05.02.2013 15:36

это функция now (), иначе вы можете использовать настройки по умолчанию на уровне столбца.

Anshul Sharma 29.05.2020 10:51
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
935
4
1 363 812
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

Вы можете использовать now () для установки значения столбца datetime, но имейте в виду, что вы не можете использовать это как значение по умолчанию.

правда. Я просто попробовал использовать сейчас и получил ошибку «Код ошибки: 1067. Недопустимое значение по умолчанию.». так что ответ? ;-)

Brian Boatright 04.10.2008 00:31

Это лучшее решение для компрометации MySQL версий 5.5 и 5.6. Для версии 5.5 предварительно определите значение NOW() и используйте его позже для вставки. Для версии 5.6 просто установите NOW() как значение по умолчанию.

Abel Callejo 04.12.2017 22:37

Если вы пытаетесь установить значение по умолчанию как NOW (), я не думаю, что MySQL поддерживает это. В MySQL вы не можете использовать функцию или выражение в качестве значения по умолчанию для любого типа столбца, за исключением столбца типа данных TIMESTAMP, для которого вы можете указать CURRENT_TIMESTAMP по умолчанию.

Ответ принят как подходящий

ВАЖНОЕ РЕДАКТИРОВАНИЕ: Теперь это возможно достичь с помощью полей DATETIME, начиная с MySQL 5.6.5, взгляните на другой пост ниже ...

Предыдущие версии не могли этого сделать с DATETIME ...

Но вы можете сделать это с помощью TIMESTAMP:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

ПРЕДОСТЕРЕЖЕНИЕ:ЕСЛИ вы определяете столбец с CURRENT_TIMESTAMP ON по умолчанию, вам нужно ВСЕГДА указывать значение для этого столбца, иначе значение автоматически сбрасывается на «now ()» при обновлении. Это означает, что если вы не хотите, чтобы значение изменялось, ваш оператор UPDATE должен содержать «[ваше имя столбца] = [ваше имя столбца]» (или какое-либо другое значение), иначе значение станет «now ()». Странно, но факт. Надеюсь, это поможет. Я использую 5.5.56-MariaDB

важно отметить, что datetime имеет диапазон 1000-9999, но диапазон для отметки времени составляет только 1970-2038 гг.. это может быть проблемой, если ваша система должна хранить даты рождения или вам нужно обрабатывать что-то вроде плана выплат по 30-летней ипотеке. dev.mysql.com/doc/refman/5.0/en/datetime.html

Kip 27.09.2011 21:01

Также будьте осторожны с меткой времени, так как она автоматически обновляется волшебным образом ... см. Следующий ответ stackoverflow.com/a/1483959/233906

Cerber 27.10.2012 16:31

является возможно с версии 5.6.5, см. Ответ Густава ниже (я понимаю, что ваш ответ был опубликован, когда MySQL еще был 5.0!)

e2-e4 03.03.2013 17:57

@Kip, Привет, а можно ли иметь значение по умолчанию для столбца DATE? (не столбец datetime).

Sajib Acharya 04.03.2016 00:18

ti не представляется возможным для столбцов DATE: вы должны использовать тип данных DATETIME

Fabio Napodano 20.05.2016 11:39

Это ПРЕДОСТЕРЕЖЕНИЕ неверно для mysql 5.6, если вы не указали значение ON-UPDATE, т.е. mydate DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Основано на документации и пробовал сам. - dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.htm‌ l

Curtis Yallop 26.02.2021 04:20

это действительно ужасная новость. в этом обсуждении также говорится об ограничениях типа данных timestamp.

Мне серьезно интересно, в чем проблема с реализацией этой вещи.

Произошло: dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.htm‌ l

drewish 18.04.2013 22:39

MySQL (до версии 5.6.5) не позволяет использовать функции для значений DateTime по умолчанию. TIMESTAMP не подходит из-за своего странного поведения и не рекомендуется для использования в качестве входных данных. (См. Значения по умолчанию для типов данных MySQL.)

Тем не менее, вы можете выполнить это путем создания триггера.

У меня есть таблица с полем DateCreated типа DateTime. Я создал триггер для этой таблицы «Перед вставкой» и «SET NEW.DateCreated=NOW()», и он отлично работает.

Надеюсь, это кому-нибудь поможет.

СОЗДАТЬ ТРИГГЕР trigger_foo_SetCreatedAt ПЕРЕД ВСТАВКОЙ НА foo ДЛЯ КАЖДОЙ СТРОКИ УСТАНОВИТЬ NEW.created_at = UTC_TIMESTAMP ();

kgriffs 26.10.2010 19:21

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

getWeberForStackExchange 07.10.2011 21:50

Вы, вероятно, захотите установить значение по умолчанию только IF NEW.created_at IS NOT NULL

Petr Peller 07.12.2011 14:16

Я смог решить эту проблему, используя этот оператор alter в моей таблице с двумя полями datetime.

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Это работает так, как и следовало ожидать от функции now (). Вставка нулей или игнорирование полей created_dt и updated_dt приводит к идеальному значению метки времени в обоих полях. Любое обновление строки изменяет файл updated_dt. Если вы вставляете записи через браузер запросов MySQL, вам нужен еще один шаг, триггер для обработки created_dt с новой меткой времени.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

Триггер может быть любым. Мне нравится соглашение об именах [trig] _ [my_table_name] _ [insert]

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

user188217 12.10.2009 09:07

Ой! Я имел в виду, что триггер (имя) может быть любым, каким вы хотите, потому что имя триггера вообще не влияет на функциональность. Большинство людей знают об этом, но некоторые люди, плохо знакомые с MySQL, могут не знать ...

user188217 12.10.2009 09:18

Ой, извините за отсутствие разрывов строк. Используйте точки с запятой, чтобы отметить конец каждой строки.

user188217 12.10.2009 09:27

Для всех, кто использует столбец TIMESTAMP в качестве решения, я хочу подтвердить следующее ограничение из руководства:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

Тип данных TIMESTAMP имеет диапазон от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC. Он имеет различные свойства в зависимости от версии MySQL и режима SQL, в котором работает сервер. Эти свойства описаны далее в этом разделе ".

Так что это явно сломает ваше программное обеспечение примерно через 28 лет.

Я считаю, что единственное решение на стороне базы данных - использовать триггеры, как указано в других ответах.

Что, если бы MySQL был обновлен через 20 лет и это ограничение было снято? Я не уверен, возможно ли это, но это просто мысль.

NessDan 02.05.2012 01:00

@NessDan looool

Jota.Toledo 04.12.2020 17:05

Вы можете разрешить метку времени по умолчанию. Сначала подумайте, какой набор символов вы используете, например, если вы выбрали utf8, этот набор символов поддерживает все языки, а если вы выбрали laten1, этот набор символов поддерживает только английский язык. Следующая установка, если вы работаете над каким-либо проектом, вы должны знать часовой пояс клиента и выбрать, что вы являетесь клиентской зоной. Этот шаг является обязательным.

Столбцы DateTime не могут иметь значений по умолчанию. Это задокументированная «особенность». Не все разработчики могут изменять кодировку символов. И установка сервера на часовой пояс клиенты обычно невозможна, особенно когда не все клиенты являются родными для одной области часового пояса.

rlb.usa 21.10.2010 22:39

Для этого можно использовать триггеры.

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;

При определении многострочных триггеров необходимо изменить разделитель, поскольку точка с запятой будет восприниматься компилятором MySQL как конец триггера и генерировать ошибку. например

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

Для меня триггерный подход сработал лучше всего, но я обнаружил в нем загвоздку. Рассмотрим базовый триггер для установки поля даты на текущее время при вставке:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

Обычно это хорошо, но предположим, что вы хотите установить поле вручную с помощью оператора INSERT, например:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Что происходит, так это то, что триггер немедленно перезаписывает указанное вами значение для поля, и поэтому единственный способ установить не текущее время - это последующий оператор UPDATE - фу! Чтобы переопределить это поведение при наличии значения, попробуйте этот слегка измененный триггер с оператором IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Это дает лучшее из обоих миров: вы можете указать значение для столбца даты, и оно займет, в противном случае по умолчанию будет установлено текущее время. Это все еще гетто по сравнению с чем-то чистым, например, DEFAULT GETDATE () в определении таблицы, но мы приближаемся!

+1 за подтверждение предупреждения с перезаписью явных пользовательских значений при вставке.

Kip 27.09.2011 21:21

Я лично считаю, что это лучший способ. TIMESTAMP действительно ведет себя странно, и я бы никогда не стал писать код с ограничением в 2038 лет.

Eric 24.01.2012 22:30

Ничего, я понял. Забыл установить поле для разрешения NULL. Больше никаких предупреждений.

Kaji 01.03.2012 18:43

Триггеры - это зло! Используйте их только тогда, когда нет другого способа что-то сделать. Лучше обновить до 5.6.x id, чем использовать триггер.

ksymeon 24.01.2015 03:17

В MySQL 5.5 IFNULL не работает в DATETIME; используя вышеуказанный триггер, dateAdded покажет все '0000-00-00 00:00:00'. Использование этого дает трюк: `ДЛЯ КАЖДОЙ СТРОКИ IF NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); КОНЕЦ ЕСЛИ; `

Kenney 12.06.2015 17:16

Для всех тех, кто упал духом, пытаясь установить значение ДАТА ВРЕМЯ по умолчанию в MySQL, я точно знаю, что вы чувствуете / чувствуете. Итак, вот это:

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

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

Я буквально прыгаю после решения этой: D

Не вставляет не текущее время. Будет вставлено «0000-00-00 00:00:00».

Pit Digger 23.08.2011 19:27

Я не сказал, что он устанавливает текущее время. Многие люди пытались / пытаются установить нулевое значение по умолчанию, но это просто не работает. Нам нужно исключить кавычки. Поскольку это открытие вызвало много времени и разочарований, я подумал поделиться им с сообществом. Такие люди, как вы, несут ответственность за то, что пользователи теряют интерес к обмену полезной информацией с другими людьми. Я серьезно не вижу причин получать -1! Что бы ни.

Augiwan 24.08.2011 17:41

То же самое может быть достигнуто с помощью DATETIME NOT NULL.

SineSwiper 17.02.2014 22:25

Внутри примера команды sql есть еще один символ `, который я не могу отредактировать, поскольку это только односимвольное редактирование.

quapka 24.05.2016 12:26

ваш код не работал у меня, вот что сработало ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;

Smith 01.02.2019 00:33

Хотя вы не можете сделать это с DATETIME в определении по умолчанию, вы можете просто включить оператор select в свой оператор вставки следующим образом:

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

Обратите внимание на отсутствие цитат вокруг стола.

Для MySQL 5.5

Вот как это сделать в MySQL 5.1:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Я понятия не имею, почему вам нужно вводить имя столбца дважды.

CHANGE также используется для переименования поля. Имя первого столбца - «старый», имя второго столбца - «новое». Это выглядит излишним, если вы не меняете имя поля. Если это слишком эстетично, попробуйте ИЗМЕНИТЬ.

John Gordon 28.01.2012 00:29

В версии 5.6.5 можно установить значение по умолчанию для столбца datetime и даже создать столбец, который будет обновляться при обновлении строки. Определение типа:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Справка: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

Недопустимое значение по умолчанию для menu_creation_time.

Fernando Trindade 10.07.2014 14:34

@FernandoTrindade Вам нужна MySQL версии 5.6.5 или новее. Вы можете увидеть, как это работает здесь: sqlfiddle.com/#!9/dd2be

Gustav Bertram 10.07.2014 14:38

@GustavBertram, я использую версию 5.6.22, но все равно получаю следующую ошибку: CREATE TABLE tbl (InsertDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UpdateDate TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP (6)); Код ошибки: 1294. Недопустимое предложение ON UPDATE для столбца UpdateDate.

Manish Sapkal 15.12.2014 12:31

@ManishSapkal Вы используете TIMESTAMP, а не DATETIME. Кроме того, не делайте его NULL.

Gustav Bertram 15.12.2014 12:53

Я считаю, что синтаксис «ON UPDATE» неправильный. Согласно dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.htm‌ l это должен быть dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Dan Bough 20.07.2017 16:48

У меня это решение не работает. Ошибка при создании таблицы / * Ошибка SQL (1067): недопустимое значение по умолчанию для 'creation_time' * /

Jam 24.03.2018 14:45

Если вы пытаетесь установить значение по умолчанию как NOW (), MySQL поддерживает то, что вам нужно изменить тип этого столбца TIMESTAMP вместо DATETIME. TIMESTAMP имеет текущую дату и время по умолчанию .. я думаю, что это решит вашу проблему ..

CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

В приведенном выше запросе для создания «testtable» я использовал «1999-12-12 12:12:12» в качестве значения по умолчанию для столбца DATETIME colname.

MySQL 5.6 исправил эту проблему.

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'

Возьмем, к примеру, если бы у меня была таблица с именем site со столбцами created_at и update_at, которые оба были DATETIME и нуждались в значении по умолчанию now, я мог бы выполнить следующий sql для достижения этого.

ALTER TABLE `site` CHANGE `created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `created_at` `created_at` DATETIME  NULL DEFAULT NULL;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` DATETIME NULL DEFAULT  NULL;

Последовательность операторов важна, потому что в таблице не может быть двух столбцов типа TIMESTAMP со значениями по умолчанию CUREENT TIMESTAMP.

Это мой пример триггера:

/************ 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 Server 5.7.11 и это предложение:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

нет работает. Но следующее:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

просто работает.

Как Примечание, он упоминается в документы MySQL:

The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.

даже если они также говорят:

Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').

Используйте следующий код

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;

Если вы уже создали таблицу, вы можете использовать

Чтобы изменить значение по умолчанию на текущую дату и время

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Чтобы изменить значение по умолчанию на «2015-05-11 13:01:01»

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';

Я думаю, что в mysql это просто, так как mysql - встроенная функция, называемая now (), которая дает текущее время (время этой вставки).

Итак, ваш запрос должен выглядеть примерно так же

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

Спасибо.

Прекрасно работает с MySQL 8.x

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;

Если вы установите ON UPDATE CURRENT_TIMESTAMP, это займет текущее время при обновлении данных строки в таблице.

 CREATE TABLE bar(
        `create_time` TIMESTAMP CURRENT_TIMESTAMP,
        `update_time` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )

Другие вопросы по теме