【问题标题】:MySQL: adding current year as a default value for a field 'year'MySQL:将当前年份添加为字段“年份”的默认值
【发布时间】:2020-10-20 01:09:56
【问题描述】:

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

我可以做些什么来获得这个功能?提前致谢!

【问题讨论】:

  • 拥有与数据类型同名的列通常是一个非常糟糕的主意

标签: mysql mysql-error-1067


【解决方案1】:

数据中的 DEFAULT 值子句 类型规范表示默认值 列的值。与一个 例外,默认值必须是 持续的;它不能是一个函数或 一种表达。这意味着,对于 例如,您不能设置 日期列的默认值为 NOW() 等函数的值或 当前的日期。例外是 您可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMP 列的默认值。

-- MySQL Manual

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

我认为这可行:

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

【讨论】:

    【解决方案2】:

    以下应该有效:

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

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

    【讨论】:

    • 漂亮,我今天也在找一模一样的东西!
    【解决方案3】:

    我知道这是一篇相当老的帖子,但其他人仍然通过搜索引擎找到它。从 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()));
    

    【讨论】:

      猜你喜欢
      • 2022-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2020-11-11
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多