如何使用外键创建 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 表?的主要内容,如果未能解决你的问题,请参考以下文章