【问题标题】:what is FOREIGN KEY is for?FOREIGN KEY 是干什么用的?
【发布时间】:2011-11-29 18:16:24
【问题描述】:

假设我有 2 张桌子:

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

现在我希望 dept 引用 Department 中的现有值。 所以我在创建表中写:

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

我的问题是,我在许多示例中看​​到您还将foreign keyreferences 语句放在一起。我不明白什么是主键。 这是否意味着dept 也将成为Worker 上的键?

谢谢

【问题讨论】:

  • 您的工作表应该有 dept_id,而不是 dept。用于“引用”和“外键”的语法因 SQL 实现而异。
  • 某些实现可能允许您使用dept references Department,但在这些情况下您可能需要放弃integer

标签: sql


【解决方案1】:

来自Wikipedia

主键是唯一指定一个 排。这是唯一键的特例。 . . .主键是 添加到 SQL 标准中主要是为了方便应用程序 程序员。

您不能在没有主键的情况下引用表中的记录。外键允许您在单个记录中引用另一个表中的记录。此外键通常引用外表中的主键。

【讨论】:

    【解决方案2】:
    • 这篇文章有很多很棒的信息。特别是,请查看排名最高的答案,了解该做和不该做的项目符号列表。

    What's wrong with foreign keys?

    • 这篇文章给出了一个相当不错的解释,考虑到海报的 原始示例:

    What will these foreign keys do?

    【讨论】:

      【解决方案3】:

      假设每个工人在任何时候只能在一个部门工作。 所以每个部门都有自己唯一的ID。这是部门的主键,因为两个部门不应该有相同的 id。

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

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

      【讨论】:

        【解决方案4】:

        你有两张桌子:

        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
        

        每个玩家都在一个团队中。

        球员有球队的外键(FK_team_id)。您也可以删除 TEAM,这将删除其中的所有玩家级联(如果已配置)。

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

        编辑: 你不是要外键吗?

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

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

        【讨论】:

          【解决方案5】:

          不清楚,要求应该是

          部门(部门) Worker(id,dept) - 键应该是 id

          表示 dept 是 Department 的主键,worker 的外键。 外键在工作表中不是唯一的,但在部门表中是唯一的。

          worker 表不能有某个未在 Department 中定义的未知部门。

          我说得有道理吗?

          【讨论】:

            【解决方案6】:

            为了确保表格的完整性,不允许您在不引用现有行(在部门)的情况下在表格(工人)中输入值

            【讨论】:

              【解决方案7】:

              根据 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 FOREIGN KEY关键字是必需的(引用列的规则与前面所述相同),例如这里只是几个例子:

              CREATE TABLE Department ( Department INTEGER NOT NULL PRIMARY KEY, ...);
              CREATE TABLE Worker (dept INTEGER, FOREIGN KEY (dept) REFERENCES Department, ...);
              
              CREATE TABLE Department ( Department INTEGER NOT NULL UNIQUE, ...);
              CREATE TABLE Worker (dept INTEGER, FOREIGN KEY (dept) REFERENCES Department (dept), ...);
              
              CREATE TABLE DepartmentHistory 
              (
               dept INTEGER NOT NULL, 
               dt DATE NOT NULL,
               PRIMARY KEY (dt, dept), 
               ...
              );
              CREATE TABLE Worker
              (
               dept INTEGER NOT NULL, 
               dept_dt DATE NOT NULL, 
               FOREIGN KEY (dept_dt, dept) REFERENCES DepartmentHistory, 
               ...
              );
              

              【讨论】:

                猜你喜欢
                • 2016-07-12
                • 2012-11-20
                • 2016-06-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-05-06
                • 2021-05-14
                • 1970-01-01
                相关资源
                最近更新 更多