外键和引用键有什么区别?

And*_*son 31 sql database foreign-keys

我对这两个词非常困惑.它们是相同还是不同?

有些书和人说他们是一样的,有些人说他们是不同的.

我试过但找不到确凿的答案.

Nie*_*ard 54

我假设你在谈论使用不使用关键字的REFERENCES地方FOREIGN KEY,例如.

author_id INTEGER REFERENCES author(id)
Run Code Online (Sandbox Code Playgroud)

... 代替 ...

author_id INTEGER,
FOREIGN KEY(author_id) REFERENCES author(id)
Run Code Online (Sandbox Code Playgroud)

答案是,它只是同一事物的简写语法.改变两者之间的主要问题应该是可读性.

  • @exSnake我终于抽出时间来更新答案,注意到MySQL和其他实现之间的区别:-)感谢您的提示! (2认同)

小智 12

外键必须引用主键。当简单地使用 REFERENCES 约束时,被引用的键不必是主键。


Bil*_*win 12

就标准 SQL 而言,两者都会导致外键约束。

一种形式是表约束,这意味着它可以应用于一列或多列。您需要它来引用具有多列主键的表:

CREATE TABLE child (
    id int PRIMARY KEY,
    parent_id int,
    date date,
    FOREIGN KEY (parent_id, date) REFERENCES parent(id, date)
);
Run Code Online (Sandbox Code Playgroud)

另一种形式是列约束,这意味着它只能应用于定义它的单个列。它不能用于引用具有多列主键的表。

CREATE TABLE child (
    id int PRIMARY KEY,
    parent_id int REFERENCES parent(id)
);
Run Code Online (Sandbox Code Playgroud)

上述语法的工作方式与为单个列声明表约束完全相同(假设 RDBMS 支持这种类型的列约束),如下所示:

CREATE TABLE child (
    id int PRIMARY KEY,
    parent_id int,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);
Run Code Online (Sandbox Code Playgroud)

MySQL 及其 InnoDB 存储引擎的用户经常会感到困惑,因为不支持后者的列约束样式。您必须为外键定义表级约束,即使它是单列约束。从 MySQL 早期开始,这就是一个奇怪的行为,某些约束语法是有效的,但结果却没有约束。请参阅此处的讨论:https ://bugs.mysql.com/bug.php?id=17943

  • 这是一个表约束。但这种区别仅在于它出现在语法中的位置。它们都是外键约束,并且功能是相同的。我进行了编辑以澄清问题,但它改变了示例的顺序,因此您的评论现在指的是第三个示例。 (2认同)

Mik*_*ll' 9

"参考密钥"不是关系建模或美国英语SQL实现中的常规技术术语.

外键"引用"其他表中的键; 这可能是混乱的来源吗?


man*_*sha 7

你并没有真正称之为引用键 ......它们是相同的东西......你可能会在sqlite中看到引用的单词:你可能会使用这样的语法来启动作者和书籍的数据库.这可以让您显示一位作者可以拥有多本书.这告诉数据库books.author_id(定义了几行)引用author.id

CREATE TABLE 'author' (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    firstname varchar(255)
    lastname varchar(255)
);

CREATE TABLE 'books' (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    author_id INTEGER,
    title varchar(255),
    published date,
    FOREIGN KEY(author_id) REFERENCES author(id)
);
Run Code Online (Sandbox Code Playgroud)


小智 7

“FOREIGN KEY”和“REFERENCES”这两个关键字之间唯一也是最重要的区别是,虽然它们都使数据成为父表的子数据,但“FOREIGN KEY”用于创建表级约束,而REFERENCES 关键字只能用于创建列级约束。列级约束只能在创建表时创建。但是表级约束可以使用 ALTER TABLE 命令添加。