Как установить значение по умолчанию для столбца MySQL Datetime? - PullRequest
822 голосов
/ 04 октября 2008

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

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

Ответы [ 24 ]

798 голосов
/ 04 октября 2008

ВАЖНОЕ РЕДАКТИРОВАНИЕ: Теперь это можно сделать с помощью полей 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>

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

541 голосов
/ 15 мая 2012

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

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

Ссылка: http://optimize -this.blogspot.com / 2012/04 / дата и время по умолчанию, теперь наконец-available.html

140 голосов
/ 27 сентября 2009

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

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

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

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

129 голосов
/ 20 апреля 2011

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

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 () в определении таблицы, но мы приближаемся!

26 голосов
/ 12 октября 2009

Мне удалось решить эту проблему с помощью этого оператора 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 () будет работать. Вставка пустых значений или игнорирование полей созданного и обновленного приводит к идеальному значению метки времени в обоих полях. Любое обновление строки изменяет updated_dt. Если вы вставляете записи через браузер запросов MySQL, вам понадобится еще один шаг - триггер, чтобы обработать созданный_дет с новой отметкой времени.

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

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

22 голосов
/ 12 февраля 2011

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

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;
16 голосов
/ 22 июня 2011

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

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

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

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

13 голосов
/ 22 февраля 2013

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

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
12 голосов
/ 10 марта 2009

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

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

9 голосов
/ 07 декабря 2016

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

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

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...