【发布时间】:2021-10-29 08:44:17
【问题描述】:
我希望有一列的值依赖于 MySQL Server 5.7(InnoDB Cluster)中同一表的其他列。
作为我陈述的基础和测试,我使用了以下说明:
ALTER TABLE contracts
ADD COLUMN curr_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
但我希望我的列是 DATE 并且其值始终是由公式 ADDDATE(order_loaded_on, INTERVAL FLOOR(delivery_time * 1.4) DAY) 得出的日期(其中 order_loaded_on 是 DATE 和 delivery_time 是 INT ),所以我编写并运行了以下内容:
ALTER TABLE contracts
ADD COLUMN est_delivery_on DATE
DEFAULT ADDDATE(order_loaded_on, INTERVAL FLOOR(delivery_time * 1.4) DAY)
ON UPDATE ADDDATE(order_loaded_on, INTERVAL FLOOR(delivery_time * 1.4) DAY)
但是它在第 4 行的 ADDDATE(order_loaded_on, INTERVAL FLOOR(delivery_time * 1.4) DAY) 附近返回了一个语法错误,所以我在没有 ON UPDATE 子句的情况下运行它并且它可以工作。问题是如果没有后一个子句,它不会在记录更改时更新。
我哪里做错了?
更新:
根据建议,我尝试将其添加为运行以下内容的生成列:
ALTER TABLE CrmContratto ADD COLUMN PrevistaConsegna DATE AS ADDDATE(DataCaricamentoOrdine, INTERVAL FLOOR(TempiConsegna * 1.4) DAY)
但它返回另一个语法错误。
正确的陈述在接受的答案中。谢谢。
【问题讨论】:
-
我认为计算列会比这里的默认值更好。查看其他帖子以供参考:stackoverflow.com/q/5222044/2557263
-
@Alejandro 感谢您的评论。我没有考虑计算列,我同意它会更好。我尝试运行
ALTER TABLE CrmContratto ADD COLUMN PrevistaConsegna DATE AS ADDDATE(DataCaricamentoOrdine, INTERVAL FLOOR(TempiConsegna * 1.4) DAY),但它返回另一个语法错误。 -
用这个新的尝试和你得到的确切错误消息更新问题。还包括您正在使用的确切服务器版本。
-
DATE 数据类型的列可能只有文字,没有表达式,DEFAULT 和 ON UPDATE 值。
标签: mysql sql phpmyadmin mariadb mysql-5.7