如何使用外键创建mysql表?

问题描述

我只是试图用两个外键创建一个表。其他两个表(用户和拼图)已经具有主键user_id和puzzle_id

CREATE TABLE `bglascoc_puzzle_db`.`comments` (
  `comment_id` INT NOT NULL,`comment` VARCHAR(144) NULL,`user_id` INT NOT NULL,`puzzle_id` INT NOT NULL,PRIMARY KEY (`comment_id`),INDEX `user_id` (`user_id` ASC) INVISIBLE,INDEX `puzzle_id` (`puzzle_id` ASC) VISIBLE,CONSTRAINT `user_id`
    FOREIGN KEY (`user_id`)
    REFERENCES `bglascoc_puzzle_db`.`users` (`user_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,CONSTRAINT `puzzle_id`
    FOREIGN KEY (`puzzle_id`)
    REFERENCES `bglascoc_puzzle_db`.`puzzles` (`puzzle_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

但是,我收到错误消息“您的sql语法有误;请查看与您的MariaDB服务器版本相对应的手册,以找到在'''附近使用的正确语法

解决方法

您正在运行MariaDB,而不是MySQL,如错误消息所示。与MySQL在8.0版中添加了此功能不同,MariaDB仅不支持不可见索引。您需要删除该关键字。

我还认为ASC是索引的默认排序方向,因此该关键字实际上是多余的。

所以:

CREATE TABLE `bglascoc_puzzle_db`.`comments` (
  `comment_id` INT NOT NULL,`comment` VARCHAR(144) NULL,`user_id` INT NOT NULL,`puzzle_id` INT NOT NULL,PRIMARY KEY (`comment_id`),INDEX `user_id` (`user_id`),INDEX `puzzle_id` (`puzzle_id`),CONSTRAINT `user_id`
    FOREIGN KEY (`user_id`)
    REFERENCES `bglascoc_puzzle_db`.`users` (`user_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,CONSTRAINT `puzzle_id`
    FOREIGN KEY (`puzzle_id`)
    REFERENCES `bglascoc_puzzle_db`.`puzzles` (`puzzle_id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

外键约束的声明看起来不错(只要父列存在,已建立索引并且具有匹配的数据类型-无法从您提供的信息中得知)。

,

语法问题是索引中的关键字INVISIBLE和VISIBLE,将它们删除即可使用