将数据库脚本导入我的数据库会引发 #1064 错误
Importing a database script into my database throws an #1064 error
你能帮帮我吗?我买了一个域只是为了学习数据库等,我在 MySQL Workbench 中创建了我的数据库模型。我生成了一个脚本并尝试使用 phpMyAdmin 将其导入到我的数据库中。这是脚本:
CREATE TABLE IF NOT EXISTS `knight` (
`idKnight` INT NOT NULL AUTO_INCREMENT,
`strength` INT NOT NULL DEFAULT 1,
`agility` INT NOT NULL DEFAULT 1,
`vitality` INT NOT NULL DEFAULT 1,
`attack` INT GENERATED ALWAYS AS (agility*strength) STORED,
`defense` INT GENERATED ALWAYS AS (vitality*strength) STORED,
`idUser` INT NOT NULL,
`idTavern` INT NULL,
PRIMARY KEY (`idKnight`),
INDEX `fk_user_idx` (`idUser` ASC),
INDEX `fk_tavern_idx` (`idTavern` ASC),
CONSTRAINT `fk_user` FOREIGN KEY (`idUser`)
REFERENCES `user` (`idUser`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tavern` FOREIGN KEY (`idTavern`)
REFERENCES `tavern` (`idTavern`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
这是错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GENERATED ALWAYS AS (agility*strength) STORED,
defense
INT GENERATED ALWAYS ' at line 6
现在的问题是如何同步生成脚本的数据库的 MySQL Workbench 版本和数据库本身。数据库是Inno DB。
感谢您的帮助
编辑:MySQL 我服务器的版本是:5.6.28
此类问题表明在开发中使用与部署到生产服务器时最终使用的相同版本的数据库的重要性。所以您不会对不兼容性感到惊讶。
您可以 运行 仅当您避免 MySQL 的更新版本中引入的 SQL 功能时,该脚本才能针对您的 MySQL 5.6 服务器。这包括生成的列,这些列在 MySQL 5.7.
中首次引入
因此您需要删除这些列,或者将它们更改为没有生成选项的普通 INT 列。
`attack` INT GENERATED ALWAYS AS (agility*strength) STORED,
`defense` INT GENERATED ALWAYS AS (vitality*strength) STORED,
如果您需要查询结果集中的那些列,您有几个替代解决方案:
将它们作为表达式添加到 SELECT 查询的 select 列表中:
SELECT (agility*strength) AS `attack`, (vitality*strength) AS `defense`
FROM `knight` ...
或者您可以create a VIEW使用这些表达式对查询进行编码。
或者您可以将这些列添加为纯整数,并write TRIGGERs on INSERT and UPDATE使它们与其他列保持同步。
MySQL 5.6.28 于 2015 年 12 月发布,整个 5.6 分支已超过其支持终止日期。这意味着如果从现在开始发现任何安全漏洞,它们将不会被修复。此外,您已经使用了一个过时的 5.6 版本,有很多错误。最后一个 5.6 版本是 2021 年 1 月的 5.6.51。
你能帮帮我吗?我买了一个域只是为了学习数据库等,我在 MySQL Workbench 中创建了我的数据库模型。我生成了一个脚本并尝试使用 phpMyAdmin 将其导入到我的数据库中。这是脚本:
CREATE TABLE IF NOT EXISTS `knight` (
`idKnight` INT NOT NULL AUTO_INCREMENT,
`strength` INT NOT NULL DEFAULT 1,
`agility` INT NOT NULL DEFAULT 1,
`vitality` INT NOT NULL DEFAULT 1,
`attack` INT GENERATED ALWAYS AS (agility*strength) STORED,
`defense` INT GENERATED ALWAYS AS (vitality*strength) STORED,
`idUser` INT NOT NULL,
`idTavern` INT NULL,
PRIMARY KEY (`idKnight`),
INDEX `fk_user_idx` (`idUser` ASC),
INDEX `fk_tavern_idx` (`idTavern` ASC),
CONSTRAINT `fk_user` FOREIGN KEY (`idUser`)
REFERENCES `user` (`idUser`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tavern` FOREIGN KEY (`idTavern`)
REFERENCES `tavern` (`idTavern`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
这是错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GENERATED ALWAYS AS (agility*strength) STORED,
defense
INT GENERATED ALWAYS ' at line 6
现在的问题是如何同步生成脚本的数据库的 MySQL Workbench 版本和数据库本身。数据库是Inno DB。
感谢您的帮助
编辑:MySQL 我服务器的版本是:5.6.28
此类问题表明在开发中使用与部署到生产服务器时最终使用的相同版本的数据库的重要性。所以您不会对不兼容性感到惊讶。
您可以 运行 仅当您避免 MySQL 的更新版本中引入的 SQL 功能时,该脚本才能针对您的 MySQL 5.6 服务器。这包括生成的列,这些列在 MySQL 5.7.
中首次引入因此您需要删除这些列,或者将它们更改为没有生成选项的普通 INT 列。
`attack` INT GENERATED ALWAYS AS (agility*strength) STORED,
`defense` INT GENERATED ALWAYS AS (vitality*strength) STORED,
如果您需要查询结果集中的那些列,您有几个替代解决方案:
将它们作为表达式添加到 SELECT 查询的 select 列表中:
SELECT (agility*strength) AS `attack`, (vitality*strength) AS `defense`
FROM `knight` ...
或者您可以create a VIEW使用这些表达式对查询进行编码。
或者您可以将这些列添加为纯整数,并write TRIGGERs on INSERT and UPDATE使它们与其他列保持同步。
MySQL 5.6.28 于 2015 年 12 月发布,整个 5.6 分支已超过其支持终止日期。这意味着如果从现在开始发现任何安全漏洞,它们将不会被修复。此外,您已经使用了一个过时的 5.6 版本,有很多错误。最后一个 5.6 版本是 2021 年 1 月的 5.6.51。