我对这两个术语很困惑。它们是相同还是不同?
有些书和人说它们相同,有些则说它们不同。
我尝试过,但找不到确凿的答案。
我假设您正在谈论使用
REFERENCES
,其中在约束内联列时不使用 FOREIGN KEY
关键字,这称为 列级外键约束,例如。
author_id INTEGER REFERENCES author(id)
...而不是放置在列声明之后的表级外键约束...
author_id INTEGER,
FOREIGN KEY(author_id) REFERENCES author(id)
答案是,它只是同一事物的简写语法。在两者之间进行更改时的主要关注点应该是可读性。
对于更高级的使用,只有表级外键约束可以同时描述多个键的约束,其中所有键都必须存在于引用的表中,这可能是相关的。
请注意,MySQL“解析但忽略“内联REFERENCES
规范”(如 SQL 标准中定义),其中引用被定义为列规范的一部分”,这意味着只有表级外键约束会起作用。
Postgres 和Microsoft 的 SQL Server 都尊重列级和表级外键约束。
必须引用主键。 当简单地使用 REFERENCES 约束时,引用的键不必是主键。
一种形式是
表约束,这意味着它可以应用于一列或多列。您需要它来引用具有多列主键的表:
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 早期开始,这就是一个奇怪的行为,某些约束语法是有效的,但结果却没有约束。请参阅此处的讨论:
外键“引用”其他表中的键;难道这就是混乱的来源吗?
参考键...它们是同一件事...你可能会看到单词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)
);
一行中的外键值被称为“引用”包含相应键值的行。请注意,前一句中的“引用”一词是一个动词,因此我们可以说我们有一个引用外键值和一个引用键值。
虽然被引用的是键值,而不是表键约束,但我想宽松地说,我们可以说“引用键”是指包含可能被引用的值的行。然后我看到“引用键”如何成为“引用键”,但又不掩盖其起源。
参考文献()