【问题标题】:Failed generated stored procedure生成存储过程失败
【发布时间】:2019-04-27 07:35:50
【问题描述】:

这是代码

CREATE TABLE `church` (
  `ID` int(10) UNSIGNED NOT NULL,
  `StudentID` int(11) NOT NULL,
  `semesterID` int(11) NOT NULL,
  `attendedWed` int(11) NOT NULL,
  `attendedFri` int(11) NOT NULL,
  `attendedSabM` int(11) NOT NULL,
  `attendedSabE` int(11) NOT NULL,
  `ChurchScore` double(10,2) GENERATED ALWAYS AS ((((((`attendedWed` + `attendedFri`) + `attendedSabM`) + `attendedSabE`) * 100) / 60)) STORED
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这是错误

操作失败:将 SQL 脚本应用到 数据库。执行:ALTER TABLE citizenshipgroup3.church 更改列 ChurchScore ChurchScore DOUBLE(10,2) NULL DEFAULT attendedWed;

ERROR 1064:您的 SQL 语法有错误;检查手册 对应于正确语法的 MariaDB 服务器版本 在第 2 行 SQL 语句的“attendedWed”附近使用:ALTER TABLE citizenshipgroup3.church 更改列ChurchScore ChurchScore DOUBLE(10,2) NULL DEFAULT attendedWed

【问题讨论】:

  • 什么存储过程,什么alter语句?
  • DEFAULT attendedWed - 我怀疑您是否可以将一列的默认值定义为另一列。 编辑:实际上它是允许的,但仅适用于 MySQL 版本 >= 8.0.13(确实是特定补丁)。参考:dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html
  • 不懂@Madhur Bhaiya
  • 所以我应该更新工作台,它可能会工作吗?
  • @MykeWolf Workbench 只是一个客户端界面。您需要将 MySQL 服务器更新到最新版本。但是从您的错误消息来看,我认为您使用的不是 MySQL,而是 MariaDB。我不确定 MariaDB 是否支持将表达式作为默认列值。

标签: mysql sql mariadb mysql-workbench


【解决方案1】:

你的语法很好。问题是 MySQL 直到 5.7 才支持生成的列。您可能使用的是早期版本。

可能最简单的解决方案是使用视图进行计算。

【讨论】:

    【解决方案2】:

    错误出现在ALTER TABLE 时,当您尝试修改列ChurchScoreDEFAULT 值设置为涉及另一个列attendedWed 的表达式时。

    另外,您的错误消息似乎来自 MariaDB,而不是 MySQL。

    来自Mariadb Documentation

    从 MariaDB 10.2.1 开始,您可以在 DEFAULT 中使用大多数函数。表达式 应该有括号。如果您使用非确定性 DEFAULT 中的函数,那么所有对表的插入都将被复制 在行模式下。您甚至可以参考 DEFAULT 中的早期列 表达式:

    CREATE TABLE t1 (a int DEFAULT (1+1), b int DEFAULT (a+1));
    CREATE TABLE t2 (a bigint primary key DEFAULT UUID_SHORT());
    

    所以你需要确保几件事:

    1. 将您的 MariaDB 版本升级到 10.2.1 及更高版本。最好升级到当前最新版本(现在是 10.3+)。
    2. 您需要在DEFAULT 子句中指定的表达式周围使用括号。

    所以ALTER TABLE 语句看起来像:

    ALTER TABLE `citizenshipgroup3`.`church` 
    CHANGE COLUMN `ChurchScore` `ChurchScore` DOUBLE(10,2) NULL 
    DEFAULT (attendedWed) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多