Как установить значение по умолчанию для столбца Datetime MySQL?
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 если вы работаете в рамках любого проекта, вы должны знать часовой пояс клиента и выбрать вы клиентская зона. Этот шаг является обязательным.