10

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

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

4

3 回答 3

19

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

-- MySQL 手册

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

我认为这会起作用:

CREATE TRIGGER ins_year
BEFORE INSERT ON tips
    FOR EACH ROW SET NEW.year = YEAR(NOW());
于 2008-11-19T14:01:47.453 回答
8

以下应该有效:

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

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

于 2008-11-19T13:55:16.420 回答
4

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

ALTER TABLE `tips`
    CHANGE `year` `year` YEAR NOT NULL DEFAULT (YEAR(CURDATE()));
于 2020-10-19T17:09:56.090 回答