如何使用外键创建 mysql 表?

Posted

技术标签:

【中文标题】如何使用外键创建 mysql 表?【英文标题】:How do I create a mysql table with foreign keys? 【发布时间】:2021-02-14 23:36:29 【问题描述】:

我只是想用两个外键创建一个表。另外两个表,users和puzzles,已经有了主键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 error 1064 syntax but everything seems fine SQL 代码适用于 MySQL 8.0 sqlize.online/… 【参考方案1】:

如错误消息所示,您正在运行 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);

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

【讨论】:

【参考方案2】:

语法问题是索引中的关键字INVISIBLE和VISIBLE,去掉它们就可以了

【讨论】:

以上是关于如何使用外键创建 mysql 表?的主要内容,如果未能解决你的问题,请参考以下文章

MySql如何创建外键

mysql外键插入

如何修复“MySQL 错误:1822。缺少约束索引”关于创建复合外键

MySQL外键约束,级联删除

mysql表创建好后添加外键

如何在 Phpmyadmin 中使用主键和外键创建关系数据库?