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

8 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
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now())
Run Code Online (Sandbox Code Playgroud)

但它给出了以下错误:

1067 - Invalid default value for 'year'
Run Code Online (Sandbox Code Playgroud)

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

Pow*_*ord 17

数据类型规范中的DEFAULT值子句指示列的默认值.除了一个例外,默认值必须是常量; 它不能是一个功能或表达.这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()或CURRENT_DATE.例外情况是您可以将CURRENT_TIMESTAMP指定为TIMESTAMP列的默认值.

- MySQL手册

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

我认为这会奏效:

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


Joh*_*n C 8

我知道这是一篇相当老的帖子,但对于其他人来说仍然通过搜索引擎找到它。从 MySQL 8.0.13 开始,您可以使用表达式作为列默认值。所以,你原来的 alter 语句是有效的。您只需将其括在括号中即可,如下所示。我还建议使用YEAR 数据类型而不是 varchar,它包含验证和内置转换;like10将转换为2010etc...

ALTER TABLE `tips`
    CHANGE `year` `year` YEAR NOT NULL DEFAULT (YEAR(CURDATE()));
Run Code Online (Sandbox Code Playgroud)


Noa*_*ich 7

以下应该有效:

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅年份数据类型.

所以,一旦我获得访问权限,我就对其进行了测试.正如另一张海报所指出的,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;
Run Code Online (Sandbox Code Playgroud)

否则,将此值分配给代码中的INSERT语句.

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