MySQL: добавление текущего года в качестве значения по умолчанию для поля 'year' - PullRequest
8 голосов
/ 19 ноября 2008

У меня есть следующая таблица в MySQL (версия 5):

id     int(10)       UNSIGNED             No    auto_increment              
year   varchar(4)    latin1_swedish_ci    No             
title  varchar(250)  latin1_swedish_ci    Yes   NULL         
body   text          latin1_swedish_ci    Yes   NULL

И я хочу, чтобы БД автоматически добавляла текущий год при вставке, я пробовал следующий оператор SQL:

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now())

Но выдает следующую ошибку:

1067 - Invalid default value for 'year'

Что я могу сделать, чтобы получить эту функциональность? Заранее спасибо!

Ответы [ 2 ]

17 голосов
/ 19 ноября 2008

Предложение значения DEFAULT в данных спецификация типа указывает по умолчанию значение для столбца. С одним исключение, значение по умолчанию должно быть постоянная; это не может быть функция или выражение. Это означает, что для Например, вы не можете установить по умолчанию для столбца даты будет значение функции, такой как NOW () или ТЕКУЩАЯ ДАТА. Исключением является то, что Вы можете указать CURRENT_TIMESTAMP как по умолчанию для столбца TIMESTAMP.

- MySQL Manual

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

Я думаю, это будет работать:

CREATE TRIGGER ins_year
BEFORE INSERT ON tips
    FOR EACH ROW SET NEW.year = YEAR(NOW());
7 голосов
/ 19 ноября 2008

Должно работать следующее:

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP

Для получения дополнительной информации см. Тип данных года .

Итак, я проверил это, как только получил доступ, и он не работает. Как отметил другой автор, CURRENT_TIMESTAMP работает только с типом данных TIMESTAMP .

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

Другой вариант - создать триггер :

CREATE TRIGGER example_trigger AFTER INSERT ON tips
FOR EACH ROW BEGIN
UPDATE tips SET year = YEAR(NOW()) WHERE tip_id = NEW.tip_id
END;

В противном случае присвойте это значение инструкции INSERT из вашего кода.

Лучшее решение в вашем случае будет полностью зависеть от обстоятельств, связанных с вашим конкретным приложением.

...