【问题标题】:SQL Script can't create some tablesSQL 脚本无法创建某些表
【发布时间】:2019-05-28 14:28:03
【问题描述】:

我的 SQL 脚本首先说它没有连接,当我打开它时,我通过转到 Query -> Reconnect to server 来连接它,它可以工作。然后我尝试执行只创建前两个表的 SQL 脚本遇到错误代码 1064,并且错误位于 VISIBLE Index 行。我不知道这意味着什么,因为我对 SQL 完全陌生,有人可以帮忙吗?

错误代码:1064。您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 9 行的“INDEX userId_idx (userId ASC) VISIBLE, CONSTRAINT gameId FOREIGN”附近使用正确的语法

-- MySQL Workbench 生成的 MySQL Script -- 2019 年 1 月 2 日星期三 02:21:44 -- 型号:新型号版本:1.0 -- MySQL Workbench 正向工程

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema game_review
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema game_review
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `game_review` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
USE `game_review` ;

-- -----------------------------------------------------
-- Table `game_review`.`games`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_review`.`games` (
  `game_Id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(255) NOT NULL,
  `tags` VARCHAR(60) NOT NULL,
  `systemReq` VARCHAR(255) NOT NULL,
  `developer` VARCHAR(45) NOT NULL,
  `publisher` VARCHAR(45) NOT NULL,
  `trailer` VARCHAR(45) NULL,
  `about` VARCHAR(255) NULL,
  `platform` VARCHAR(45) NOT NULL,
  `categories` VARCHAR(45) NOT NULL,
  `description` VARCHAR(45) NOT NULL,
  `releaseDate` DATETIME NOT NULL,
  PRIMARY KEY (`game_Id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `game_review`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_review`.`users` (
  `user_Id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NOT NULL,
  `password` VARCHAR(45) NOT NULL,
  `email` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`user_Id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `game_review`.`reviews`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_review`.`reviews` (
  `review_Id` INT NOT NULL AUTO_INCREMENT,
  `gameId` INT NOT NULL,
  `userId` INT NOT NULL,
  `review` TEXT(1024) NOT NULL,
  `rating` INT NULL,
  `dateposted` DATETIME NULL,
  PRIMARY KEY (`review_Id`),
  INDEX `gameId_idx` (`gameId` ASC) VISIBLE,
  INDEX `userId_idx` (`userId` ASC) VISIBLE,
  CONSTRAINT `gameId`
    FOREIGN KEY (`gameId`)
    REFERENCES `game_review`.`games` (`game_Id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `userId`
    FOREIGN KEY (`userId`)
    REFERENCES `game_review`.`users` (`user_Id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `game_review`.`favourites`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_review`.`favourites` (
  `favourites_Id` INT NOT NULL AUTO_INCREMENT,
  `gameId` INT NOT NULL,
  `userId` INT NOT NULL,
  PRIMARY KEY (`favourites_Id`),
  INDEX `gameId_idx` (`gameId` ASC) VISIBLE,
  INDEX `userId_idx` (`userId` ASC) VISIBLE,
  CONSTRAINT `gameId`
    FOREIGN KEY (`gameId`)
    REFERENCES `game_review`.`games` (`game_Id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `userId`
    FOREIGN KEY (`userId`)
    REFERENCES `game_review`.`users` (`user_Id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `game_review`.`forum`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_review`.`forum` (
  `forum_Id` INT NOT NULL AUTO_INCREMENT,
  `gameId` INT NOT NULL,
  `userId` INT NOT NULL,
  `topic` VARCHAR(45) NOT NULL,
  `views` INT NOT NULL,
  `likes` INT NOT NULL,
  `comment` TEXT(300) NULL,
  `totalComments` INT NULL,
  `dateposted` DATETIME NOT NULL,
  PRIMARY KEY (`forum_Id`),
  INDEX `gameId_idx` (`gameId` ASC) VISIBLE,
  INDEX `userId_idx` (`userId` ASC) VISIBLE,
  CONSTRAINT `gameId`
    FOREIGN KEY (`gameId`)
    REFERENCES `game_review`.`games` (`game_Id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `userId`
    FOREIGN KEY (`userId`)
    REFERENCES `game_review`.`users` (`user_Id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `game_review`.`game cart`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_review`.`game cart` (
  `cart_Id` INT NOT NULL AUTO_INCREMENT,
  `gameId` INT NOT NULL,
  `quantity` INT NULL,
  PRIMARY KEY (`cart_Id`),
  INDEX `gameId_idx` (`gameId` ASC) VISIBLE,
  CONSTRAINT `gameId`
    FOREIGN KEY (`gameId`)
    REFERENCES `game_review`.`games` (`game_Id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

【问题讨论】:

  • mysql 1064 是语法错误。请发布您收到的完整错误消息
  • 这里是错误代码。错误代码:1064。您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 9 行的“INDEX userId_idx (userId ASC) VISIBLE, CONSTRAINT gameId FOREIGN”附近使用正确的语法
  • 对不起,没用

标签: mysql database server


【解决方案1】:

您的索引声明不正确:VISIBLE 不是可识别的语法。此外,ASC 提及是多余的,因为它对应于默认值。

替换:

...
INDEX `gameId_idx` (`gameId` ASC) VISIBLE,
INDEX `userId_idx` (`userId` ASC) VISIBLE,
...

与:

...
INDEX `reviews_gameId_idx` (`gameId`),
INDEX `reviews_userId_idx` (`userId`),
...

有关更多信息,请参阅the mysql CREATE INDEX docs

另外请记住,在除 mysql 之外的大多数 RDBMS 中,索引名称在数据库模式中是全局的,因此请确保不要两次使用相同的索引名称(我可以看到至少声明了索引 gameId_idx两次。一种解决方案是在索引名称前加上它所属的表,如上所示。

不同表之间的外键名称也必须是唯一的(您有像game_Id 这样的重复项。

最后我还注意到你的一个表名中有一个空格 (game cart):这不是一个好习惯,应该避免。

【讨论】:

  • 错误 1064 消失了,然后我得到错误代码:1005。无法创建表 game_review.game cart(错误号:121“写入或更新时重复键”)
  • 那我应该怎么做才能解决它?完全更改索引的名称(我不知道这样做的影响)或删除索引名称?对于所有这些问题,我感到非常抱歉,因为我刚刚开始使用 SQL。奇怪的是,尽管脚本是从 Workbench 本身向前设计的,但这些错误仍然出现。
  • @XavierLimJunYi :这与外键的独角兽有关...答案已更新...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多