MySQL:将当前年份添加为字段“年”的默认值

时间:2008-11-19 13:50:22

标签: mysql mysql-error-1067

我在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

我希望db在插入时自动添加当前年份,我尝试了以下SQL语句:

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

但它会出现以下错误:

1067 - Invalid default value for 'year'

我该怎么做才能获得此功能?提前谢谢!

3 个答案:

答案 0 :(得分:17)

  

数据中的DEFAULT值子句   type specification表示默认值   列的值。有一个   例外,默认值必须是a   不变;它不能是一个功能或   一种表达。这意味着,为   例如,你不能设置   日期列的默认值为   一个函数的值,如NOW()或   当前的日期。唯一的例外是   您可以将CURRENT_TIMESTAMP指定为   TIMESTAMP列的默认值。

-- MySQL Manual

但是,您可以编写一个trigger来设置值。我希望我能提供帮助,但我并不熟悉在MySQL中编写存储过程。

我认为这样可行:

CREATE TRIGGER ins_year
BEFORE INSERT ON tips
    FOR EACH ROW SET NEW.year = YEAR(NOW());

答案 1 :(得分:7)

以下内容应该有效:

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

有关详细信息,请参阅Year Data Type

所以,一旦我获得访问权限,我就测试了它,但它不起作用。正如另一张海报所指出的,CURRENT_TIMESTAMP仅适用于TIMESTAMP数据类型。

存储完整的时间戳然后只使用代码中的年份是否存在特定问题?如果没有,那么我建议将此值存储为时间戳。

您的另一个选择是创建trigger

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语句。

在您的情况下,最佳解决方案将完全取决于您的特定应用程序的具体情况。

答案 2 :(得分:0)

我知道这是一个相当老的帖子,但是对于其他人来说,仍然可以通过搜索引擎找到它。从MySQL 8.0.13开始,您可以使用expressions as column defaults。因此,您原始的alter语句是有效的。您只需要像这样将其包装在括号中即可。我还建议使用YEAR data type代替varchar,它包含验证和内置转换。例如10将被转换为2010等...

ALTER TABLE `tips`
    CHANGE `year` `year` YEAR NOT NULL DEFAULT (YEAR(CURDATE()));