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

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

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

24 ответов


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

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

но вы можете сделать это с отметкой времени:

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 по умолчанию, вам нужно будет всегда указывать значение для этого столбца или значение будет автоматически сброшено сам к" now () " по обновлению. Это означает, что если вы не хотите изменять значение, инструкция UPDATE должна содержать "[имя столбца] = [имя столбца]" (или какое-либо другое значение) или значение станет "now()". Странно, но это правда. Надеюсь, это поможет. Я использую 5.5.56-MariaDB**


в версии 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


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

что сказал, Вы можете сделать это создать триггер.

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

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


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

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');

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

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

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


я смог решить эту проблему, используя этот оператор 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]


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

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;

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

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

внимательно наблюдайте за этим Я не добавил одинарные/двойные кавычки вокруг 0

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


Это действительно ужасная новость.вот длинный ожидающий запрос ошибки / функции для этого. это обсуждение также говорит об ограничениях типа данных timestamp.

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


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

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

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

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

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';

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

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

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

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

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


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


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

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

Я запускаю MySql Server 5.7.11 и это предложение:

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

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

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

работает.

Как sidenote, это упоминается в mysql docs:

тип date используется для значений с датой, но без времени. MySQL извлекает и отображает значения даты в формате "гггг-ММ-ДД". Поддерживаемый диапазон '1000-01-01' до '9999-12-31'.

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

недопустимые значения даты, времени или метки времени преобразуются в" нулевое " значение соответствующего типа ('0000-00-00' или '0000-00-00 00:00:00').


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

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;

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


Если вы пытаетесь установить значение по умолчанию, как сейчас(), я не думаю, что MySQL поддерживает это. В MySQL вы не можете использовать функцию или выражение в качестве значения по умолчанию для любого типа столбца, за исключением столбца типа данных TIMESTAMP, для которого вы можете указать CURRENT_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


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

DELIMITER $$

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

    DELIMITER ;

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


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 со значениями по умолчанию CURIENT 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, так как mysql встроенная функция называется now (), которая дает текущее время (время этой вставки).

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

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

спасибо.


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