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

问题描述 投票:0回答:10

我对这两个术语很困惑。它们是相同还是不同?

有些书和人说它们相同,有些则说它们不同。

我尝试过,但找不到确凿的答案。

sql database foreign-keys
10个回答
115
投票

我假设您正在谈论使用

REFERENCES
,其中在约束内联列时不使用
FOREIGN KEY
关键字,这称为 列级外键约束,例如。

author_id INTEGER REFERENCES author(id)

...而不是放置在列声明之后的表级外键约束...

author_id INTEGER,
FOREIGN KEY(author_id) REFERENCES author(id)

答案是,它只是同一事物的简写语法。在两者之间进行更改时的主要关注点应该是可读性。

对于更高级的使用,只有表级外键约束可以同时描述多个键的约束,其中所有键都必须存在于引用的表中,这可能是相关的。


请注意,MySQL“解析但忽略“内联REFERENCES

规范”
(如 SQL 标准中定义),其中引用被定义为列规范的一部分”,这意味着只有表级外键约束会起作用。

PostgresMicrosoft 的 SQL Server 都尊重列级和表级外键约束。


18
投票
外键

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


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

一种形式是

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

CREATE TABLE child ( id int PRIMARY KEY, parent_id int, date date, FOREIGN KEY (parent_id, date) REFERENCES parent(id, date) );
另一种形式是

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

CREATE TABLE child ( id int PRIMARY KEY, parent_id int REFERENCES parent(id) );
上述语法的工作方式与为单列声明表约束完全相同(假设 RDBMS 支持这种类型的列约束),如下所示:

CREATE TABLE child ( id int PRIMARY KEY, parent_id int, FOREIGN KEY (parent_id) REFERENCES parent(id) );
对于MySQL及其InnoDB存储引擎的用户来说,经常会感到困惑,以前的列约束样式被接受但没有效果。您必须为外键定义表级约束,即使它是单列约束。从 MySQL 早期开始,这就是一个奇怪的行为,某些约束语法是有效的,但结果却没有约束。请参阅此处的讨论:

https://bugs.mysql.com/bug.php?id=17943


11
投票
“参考键”在美式英语的关系建模或 SQL 实现中并不是一个普通的技术术语。

外键“引用”其他表中的键;难道这就是混乱的来源吗?


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


8
投票
你并没有真正将某些东西称为

参考键...它们是同一件事...你可能会看到单词references在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) );
    

3
投票
也许您使用“参考键”一词有些宽松?

一行中的外键值被称为“引用”包含相应键值的行。请注意,前一句中的“引用”一词是一个动词,因此我们可以说我们有一个引用外键值和一个引用键值。

虽然被引用的是键值,而不是表键约束,但我想宽松地说,我们可以说“引用键”是指包含可能被引用的值的行。然后我看到“引用键”如何成为“引用键”,但又不掩盖其起源。


3
投票
有两种方法声明外键:

  1. 如果外键是 SINGLE 属性:

    参考文献()

  2. 如果外键是属性列表

外键 () 参考


2
投票
外键“引用”其他表中的键。其他表中的该键称为引用键。如果您在 phpmyadmin 上使用图形功能,您可能会听到很多关于此的信息。


1
投票
引用键是在另一个表中引用的主键。 另一方面,外键是将第二个表链接到主表主键(或引用键)的方式。

© www.soinside.com 2019 - 2024. All rights reserved.