什么是FOREIGN KEY是为了什么?

时间:2011-11-29 18:16:25

标签: sql

假设我有两张桌子:

Department(depNum)
Worker(id,deptNum) - key should be id

现在我希望dept引用Department中的现有值。 所以我在create table中写道:

CREATE TABLE Worker(
id integer primary key,
dept integer references Department);

我的问题是,我在很多例子中都看到你还将foreign keyreferences语句放在一起。我不明白什么是主键。 这是否意味着dept也是Worker的关键?

谢谢

7 个答案:

答案 0 :(得分:1)

来自Wikipedia

  

主键是唯一指定a的列的组合   行。这是一个独特键的特例。 。 。 。主键是   添加到SQL标准主要是为了方便应用程序   程序员。

如果没有主键,则无法在表中引用记录。外键允许您引用单个记录中另一个表中的记录。此外键通常引用外表中的主键。

答案 1 :(得分:1)

  • 这篇文章有很多很棒的信息。特别是,请查看排名最高的答案,并列出不做的事情。

What's wrong with foreign keys?

  • 这篇文章给出了相当不错的解释,给出了海报 原例:

What will these foreign keys do?

答案 2 :(得分:1)

假设每个工人在任何时候都只能在一个部门工作。 因此每个部门都有自己独特的ID。这是部门的主键,因为两个部门永远不应该具有相同的ID。

现在,必须跟踪每个工作人员,以便为他们分配自己的唯一ID。这是他们的主要关键。您需要将工作人员链接到他们所在的部门,因为他们一次只能在一个部门工作,您可以将他们的部门作为外键。 worker表中的外键链接到department表的ID。

这有更多信息:http://www.1keydata.com/sql/sql-foreign-key.html

答案 3 :(得分:0)

你有两张桌子:

PLAYER, 
primary key (unique) PK_player_id
player_name
foreignt key to TEAM.team_id FK_team_id

TEAM
primary key (unique) PK_team_id
team_name

每个玩家都是一个TEAM。

PLAYER有一个TEE的FOREIGN-KEY(FK_team_id)。您也可以删除TEAM,它将删除级联中的所有播放器(如果已配置)。

现在你无法创建没有现有TEAM的玩家,因为数据库可以确保这一点。

修改 你没有要求外键吗?

主键是一列或多列,它将在数据库中的datarow上标识。如果你想创建一个外键,你必须使用一个唯一的列或多个列。

在我的示例中,每个表都有一个唯一键(主键),因为名称可能会更改。要识别外键的“目标”,它必须是唯一的。因此可以使用第二个表的prmary键。 (TEAM.PK_team_id)

答案 4 :(得分:0)

我不清楚,要求应该是

署(DEPT) Worker(id,dept) - key应为id

这意味着dept是Department中的主键和worker中的外键。 外键在工作表中不是唯一的,但它在Department Table中是唯一的。

工作人员表不能有部门未定义的未知部门。

我有道理吗?

答案 5 :(得分:0)

确保表的完整性,不允许您在表(工作人员)中输入值而不引用现有行(在部门)

答案 6 :(得分:0)

根据SQL-92标准:

外键(FK)可以引用PRIMARY KEYUNIQUE CONSTRAINT。在PRIMARY KEY的情况下,可以从外键声明中省略引用的列,例如以下三个都是有效的:

CREATE TABLE Department ( Department INTEGER NOT NULL PRIMARY KEY, ...);
CREATE TABLE Worker (dept INTEGER REFERENCES Department, ...);

CREATE TABLE Department ( Department INTEGER NOT NULL PRIMARY KEY, ...);
CREATE TABLE Worker (dept INTEGER REFERENCES Department (dept), ...);

CREATE TABLE Department ( Department INTEGER NOT NULL UNIQUE, ...);
CREATE TABLE Worker (dept INTEGER REFERENCES Department (dept), ...);

以下内容无效:

CREATE TABLE Department ( Department INTEGER NOT NULL UNIQUE, ...);
CREATE TABLE Worker (dept INTEGER REFERENCES Department, ...);

...因为必须声明外键中涉及的引用列。


当在线声明一个简单(单列)FK时,如上所述省略FOREIGN KEY个关键字。

复合(多列)不能在线声明,并且不需要在线声明简单的FK:在这些情况下,引用列 AND {{1需要关键字(引用列的规则与前面所述的相同)例如这里只是几个例子:

FOREIGN KEY