生成的存储过程失败

时间:2018-11-25 13:18:53

标签: mysql sql mariadb mysql-workbench

这是代码

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 citizenshipgroup3church   更改列ChurchScore ChurchScore DOUBLE(10,2)NULL DEFAULT   attendedWed;

     

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

2 个答案:

答案 0 :(得分:0)

您的语法很好。问题是MySQL直到5.7才支持生成的列。您大概正在使用早期版本。

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

答案 1 :(得分:0)

当您尝试修改列ALTER TABLE并将ChurchScore的值设置为涉及另一个列DEFAULT的表达式时,错误将在attendedWed出现。 / p>

此外,您的错误消息似乎源自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) ;