`REFERENCES` 在 sql 中有什么作用?

What does `REFERENCES` do in sql?

我正在尝试使用简单的示例编写一对多模式。我有一个 table books 映射到许多 tags。 (参见下面的 fiddle 链接)

我想要的是标签 table 有一个书籍 table 的外键。我想我已经做到了:

 
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

那么这些片段之间有什么区别?

https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html 说:

MySQL parses but ignores “inline REFERENCES specifications” (as defined in the SQL standard) where the references are defined as part of the column specification. MySQL accepts REFERENCES clauses only when specified as part of a separate FOREIGN KEY specification.

This syntax creates a column; it does not create any sort of index or key.

When used in this fashion, the REFERENCES clause is not displayed in the output of SHOW CREATE TABLE or DESCRIBE:

也就是说,下面创建列 book_id 但不是外键约束:

`book_id` int unsigned NOT NULL REFERENCES `books`(`id`),

你必须这样做:

`book_id` int unsigned NOT NULL,
FOREIGN KEY (book_id) REFERENCES `books`(`id`),

几年前就决定跳过将内联 REFERENCES 作为列选项实现。如果您为两列或更多列创建外键,则无论如何都必须为 FOREIGN KEY 约束使用单独的行。作为列定义的一部分的内联 REFERENCES 只是一种方便的 short-cut 语法。

至少从 2004 年起,语法被解析但被忽略的事实就被报告为错误,但从未修复:

但是由于MySQL可插拔存储引擎架构,很难修复这个bug。 SQL 语法解析独立于存储引擎处理,但约束的实现在存储引擎内处理。 SQL 解析器必须允许语法,因为它不知道给定的存储引擎是否会忽略或支持该功能。