MySQL 5.7 参考TIMESTAMP生成DATE列
MySQL 5.7 generated DATE column with reference to TIMESTAMP
我的 table 中有一个 created_at
列,我想添加一个类型为 DATE
.
的 created_at_day
列
created_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_TIMESTAMP
的 DATETIME
列有效,但我不想将我的每个 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 ;
我的 table 中有一个 created_at
列,我想添加一个类型为 DATE
.
的 created_at_day
列
created_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_TIMESTAMP
的 DATETIME
列有效,但我不想将我的每个 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 ;