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)
答案是,它只是同一事物的简写语法.改变两者之间的主要问题应该是可读性.
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
你并没有真正称之为引用键 ......它们是相同的东西......你可能会在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 命令添加。
| 归档时间: |
|
| 查看次数: |
40981 次 |
| 最近记录: |