MySQL如何设置未来日期 实现reg_date加4年自动生成exp_date
实现方法
你原代码里reg_date带的ON UPDATE CURRENT_TIMESTAMP属性不符合注册日期的业务逻辑——这个属性会导致每次更新账户记录时,注册时间自动被改成当前操作时间,建议先删掉这个配置。
根据你使用的MySQL版本不同,有两类实现方案:
- MySQL 5.7及以上版本:直接用生成列/表达式默认值实现,不需要额外写触发器
- 如果只需要插入记录时自动给exp_date赋值为插入时间加4年,允许后续单独修改exp_date,用表达式默认值即可:
CREATE TABLE Accounts ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, exp_date TIMESTAMP DEFAULT (DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 4 YEAR)) )- 如果你需要强制exp_date永远和reg_date绑定,不管插入时传入什么reg_date、后续是否修改reg_date,exp_date都自动保持比reg_date晚4年,用存储生成列即可:
CREATE TABLE Accounts ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, exp_date TIMESTAMP AS (DATE_ADD(reg_date, INTERVAL 4 YEAR)) STORED ) - MySQL 5.6及更早版本:不支持表达式默认值和生成列,需要通过触发器实现自动赋值
- 先创建基础表:
CREATE TABLE Accounts ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, exp_date TIMESTAMP )- 创建插入触发器,插入记录时自动计算过期时间:
DELIMITER // CREATE TRIGGER set_acc_exp_date_before_insert BEFORE INSERT ON Accounts FOR EACH ROW BEGIN SET NEW.exp_date = DATE_ADD(NEW.reg_date, INTERVAL 4 YEAR); END// DELIMITER ;- 如果需要修改reg_date时自动同步更新exp_date,额外创建更新触发器:
DELIMITER // CREATE TRIGGER set_acc_exp_date_before_update BEFORE UPDATE ON Accounts FOR EACH ROW BEGIN SET NEW.exp_date = DATE_ADD(NEW.reg_date, INTERVAL 4 YEAR); END// DELIMITER ;
注意:TIMESTAMP类型的有效时间范围是1970-2038年,如果你的业务需要覆盖更远期的时间,建议把两个时间字段改成DATETIME类型。
内容的提问来源于stack exchange,提问作者AnotherRandomUser
相关产品推荐
相关产品推荐

