MySQL 5.7 参考TIMESTAMP生成DATE列

MySQL 5.7 generated DATE column with reference to TIMESTAMP

我的 table 中有一个 created_at 列,我想添加一个类型为 DATE.
created_at_daycreated_at_day 列应使用当前日期进行初始化。

我尝试这样做的方法是使用生成的列,因为没有 DEFAULT CURRENT DATE 或类似列。
问题是,插入新记录时出现错误:
Error executing INSERT statement. Data truncation: Incorrect date value: '0000-00-00' for column 'created_at_day' at row 1 - Connection: Localhost: 48ms

我发现了两种可能的解决方案,它们都有缺点。
一种是将 TIMESTAMP 更改为 DATETIME。出于某种原因,带有 DEFAULT CURRENT_TIMESTAMPDATETIME 列有效,但我不想将我的每个 TIMESTAMP 列更改为 DATETIME.
另一个可行的方法是在 SQL 模式下禁用 NO_ZERO_DATE。出于某种原因,当我禁用它时,日期列甚至会使用正确的值而不是 0000-00-00 进行初始化。但这感觉像是一种变通方法而不是解决方案,并且可能会导致未来出现问题。

是否有另一种简单的方法来创建用当前日期初始化的 DATE 列?

这是产生错误的示例代码:

create table test(
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  created_at_day DATE AS (DATE(created_at))
);

insert into test values();

您可以在 NOW() 上使用 DATE_FORMAT 函数:

CREATE TABLE test(stamp DATE default (DATE_FORMAT(NOW(), '%Y-%m-%d')) NOT NULL);

在 MySQL 8.0 中,您可以这样做:

create table test(
    created_at_day date as (current_date)
);

在 MySQL 5.7 中,我认为这不能仅通过 table 定义来完成。你需要一个触发器:

create table test(
    created_at_day date
);

delimiter //

create trigger trg_test_created_at_day
before insert on test 
for each row
begin
    if (new.created_at_day is null) then
        set new.created_at_day = current_date;
    end if;
end//

delimiter ;