You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL表中自动为列设置当前时间加一年的默认值

问题描述

尝试创建产品表并添加expiration列,要求插入新产品时该列自动设为当前时间加一年,最初的建表语句如下:

CREATE TABLE products (
  id int not null auto_increment PRIMARY KEY,
  Name varchar(30) not null,
  Reliability int default 0, 
  date timestamp default now(),
  expiration timestamp default (now()+31536000)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

执行时出现错误:

Error Code: 1292. Incorrect datetime value: '20221232051242' for column 'expiration'

直接通过now()+31536000(一年的秒数)设置默认值会忽略月份天数差异,导致生成无效日期(比如12月32号),无法正确实现需求。

解决方案

在MySQL中,需使用专门的日期时间函数实现当前时间自动加指定增量,避免直接加减秒数:

方法1:使用DATE_ADD函数

修改expiration列的默认值定义为DATE_ADD(NOW(), INTERVAL 1 YEAR),这是最直观的方式:

CREATE TABLE products (
  id int not null auto_increment PRIMARY KEY,
  Name varchar(30) not null,
  Reliability int default 0, 
  date timestamp default now(),
  expiration timestamp default DATE_ADD(NOW(), INTERVAL 1 YEAR)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

方法2:使用ADDDATE函数

ADDDATE是DATE_ADD的别名,用法完全一致:

CREATE TABLE products (
  id int not null auto_increment PRIMARY KEY,
  Name varchar(30) not null,
  Reliability int default 0, 
  date timestamp default now(),
  expiration timestamp default ADDDATE(NOW(), INTERVAL 1 YEAR)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

方法3:使用TIMESTAMPADD函数

如果需要更灵活的时间单位控制,也可以用TIMESTAMPADD:

CREATE TABLE products (
  id int not null auto_increment PRIMARY KEY,
  Name varchar(30) not null,
  Reliability int default 0, 
  date timestamp default now(),
  expiration timestamp default TIMESTAMPADD(YEAR, 1, NOW())
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

说明

这些函数会自动处理不同月份的天数、闰年等问题,确保生成的日期有效。比如当前时间是2023-02-28,加一年后会自动变为2024-02-29(闰年),不会出现无效日期的错误。

内容的提问来源于stack exchange,提问作者Jad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:05:15