【问题标题】:What is the syntax error in this column addition statement?此列添加语句中的语法错误是什么?
【发布时间】: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_onDATEdelivery_timeINT ),所以我编写并运行了以下内容:

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


【解决方案1】:

你不能使用ON UPDATE中的函数。

但是您可以使用生成的列,其作用与插入或更新行时生成其值的作用相同

ALTER TABLE contracts
ADD COLUMN est_delivery_on DATE
GENERATED ALWAYS AS (order_loaded_on + INTERVAL FLOOR(delivery_time * 1.4) DAY) STORED

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2017-09-21
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多