我正试图用简单的例子来编写一个1-多个模式。我有一个表books映射到多个tags。(见下面的小提琴链接)
我想要的是标签表要有一个图书表的外键。我想我已经做到了:
CREATE TABLE IF NOT EXISTS `books` (
`id` int(6) unsigned NOT NULL,
`book_name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `tags` (
`tag_id` int(6) unsigned NOT NULL,
`tag` varchar(100) NOT NULL,
`book_id` int(6) unsigned NOT NULL,
PRIMARY KEY (`tag_id`)
);我不明白以下几点之间的区别:
`book_id` int(6) unsigned NOT NULL,和
`book_id` int(6) unsigned NOT NULL REFERENCES `books`(`id`),两者都编译得很好,并且使用内部连接。
http://sqlfiddle.com/#!9/612337/1
http://sqlfiddle.com/#!9/2043b8/3
那么这些片段之间有什么区别?
发布于 2022-03-06 18:04:39
https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html说:
MySQL解析但忽略了“内联引用规范”(如SQL标准中定义的),其中引用被定义为列规范的一部分。只有在指定为单独外键规范的一部分时,MySQL才接受引用子句。此语法创建列;它不创建任何类型的索引或键。以这种方式使用时,“引用”子句不会显示在“显示创建表”或“描述”的输出中:
也就是说,下面创建列book_id,但不创建外键约束:
`book_id` int unsigned NOT NULL REFERENCES `books`(`id`),你必须这样做:
`book_id` int unsigned NOT NULL,
FOREIGN KEY (book_id) REFERENCES `books`(`id`),多年前就决定跳过将内联引用作为列选项来实现。如果为两个或多个列创建了外键,则无论如何都必须为外键约束使用单独的行。作为列定义的一部分的内联引用只是一种方便的快捷语法。
语法被解析但被忽略的事实至少自2004年以来一直被报告为bug,但从未修复过:
但是由于MySQL可插拔的存储引擎体系结构,很难修复这个错误。SQL语法解析是独立于存储引擎处理的,但是约束的实现是在存储引擎中处理的。SQL解析器必须允许语法,因为它不知道给定的存储引擎是否会忽略或支持该特性。
https://stackoverflow.com/questions/71372605
复制相似问题