我使用下面的代码将月份的第一天列添加到表中,并使用一个要自动更新的表达式。但它抛出了一个语法错误。有人请帮忙。
ALTER TABLE `abc`.`t1` ADD COLUMN `First_Day` DATE NULL DEFAULT select DATE_ADD(DATE_ADD(LAST_DAY(report_date), INTERVAL 1 DAY), INTERVAL - 1 MONTH) AFTER `Totals`;
5vf7fwbs1#
mysql不允许使用表达式来设置默认值。您可以为此创建触发器。
delimiter $$ CREATE TRIGGER test_trigger BEFORE INSERT ON `product` FOR EACH ROW SET NEW.myCol= DATE_ADD(DATE_ADD(LAST_DAY(new.report_date), INTERVAL 1 DAY), INTERVAL - 1 MONTH); END$$ delimiter;
zlwx9yxi2#
我想问一下为什么要存储这个,但如果必须的话,一个生成的列就可以了。
drop table if exists t; create table t(id int, report_date date); ALTER TABLE t ADD COLUMN `First_Day` DATE as (date_add(date_add(last_day(date(report_date)),interval 1 day),interval -1 month)); insert into t (id,report_date) values (1,'2018-01-08'),(2,'2018-02-09'); select * from t; +------+-------------+------------+ | id | report_date | First_Day | +------+-------------+------------+ | 1 | 2018-01-08 | 2018-01-01 | | 2 | 2018-02-09 | 2018-02-01 | +------+-------------+------------+ 2 rows in set (0.00 sec)
如果您选择这样做或通过触发器,则必须一次性更新以填充此列中的现有数据。
2条答案
按热度按时间5vf7fwbs1#
mysql不允许使用表达式来设置默认值。
您可以为此创建触发器。
zlwx9yxi2#
我想问一下为什么要存储这个,但如果必须的话,一个生成的列就可以了。
如果您选择这样做或通过触发器,则必须一次性更新以填充此列中的现有数据。