【问题标题】:Can I use the same foreign key constraint in two different tables?我可以在两个不同的表中使用相同的外键约束吗?
【发布时间】:2014-06-19 14:15:54
【问题描述】:

我正在尝试创建一个工作数据库。我有两种不同类型的用户:内部用户和外部用户。每种类型都有不同的属性,所以我只为它们创建了两个单独的表。在我的内部表中,我有以下字段:

f_name VARCHAR(32),
l_name VARCHAR(32),
empl_status_id INT,
admin_grp_id INT,
reliab_status_id INT,
supv_id INT

我的外部表有以下内容:

f_name VARCHAR(32),
l_name VARCHAR(32),
email VARCHAR(32),
phone VARCHAR(20),
org_id INT,
supv_id INT

我意识到我可能会创建一个单独的表,其中包含用户的名称和指向内部或外部的外键,但除此之外,我在引用 supv_id 的内部表中添加了外键约束给另一个内部用户。我称它为fk_supv_id。当我尝试对我的外部用户表做同样的事情时,我得到了ERROR 1005 (HY000)

起初我不知道问题出在哪里,但是当我尝试使用不同的名称时,它起作用了(即,我没有像内部一样将其称为 fk_supv_id,而是将其称为 fk_xtsupv_id)。

所以我的问题是,正确的方法是什么?这是两个不同表中的相同外键。在这两种情况下,它都指的是内部用户。有没有办法在没有两个不同名称的情况下做到这一点?或者我应该选择名称表并将supv_id 约束与f_namel_nameuser_type 一起添加到该表?

建议和建议表示赞赏,

谢谢! :)

【问题讨论】:

    标签: mysql database foreign-keys foreign-key-relationship


    【解决方案1】:

    有列,有外键 (FK),有约束。

    无论其他表如何,您都可以在表中拥有列名。

    FK 是引用表和列集以及引用表和列集。所有名称一起标识一个 FK。这是关于数据库的概念性问题。

    FK 约束是一个约束,它的名称在数据库中必须是唯一的。它拥有并执行一个关联的 FK,即在其声明中描述的 FK。一个表中可以有多个 FK 约束来强制执行相同的 FK。

    DBMS 对 FK 约束具有自动唯一名称。例如,名称部分加上数字部分,其中约束是具有该名称的表的第 FK 约束。实际上,您可以在一个表和多个表中多次使用相同的无名 FK 约束定义文本,每个表用于不同的 FK 约束。 (给定表中的那些执行相同的 FK。)

    您应该有一个独特的命名方案,以便在您想要命名它们时使用。应该涉及到引用和被引用的表名,并在必要时区分列名。

    令人困惑的是,当我们指的是 FK 约束时,我们说 FK。

    当您说“在两个不同的表中具有相同的外键”时,这是误用了术语。涉及两个不同的 FK,以及相应的 FK 约束。您的意思可能是“在两个 FK 约束中引用列和引用的表和列相同”或“在两个表声明的 FK 约束声明中引用相同的文本”。但 FK 约束名称必须是唯一的。

    当您说“在这两种情况下它都指的是内部用户”时,您确认被引用列的类型和/或表对于两个 FK 约束都是相同的。但对于不同的 FK,它们是不同的 FK 约束。

    【讨论】:

      【解决方案2】:

      FK 的名称必须是唯一的。您需要使用两个不同的 FK 名称。我进一步建议您应该在键名中包含有关被链接的表的信息,以使其更具描述性。

      【讨论】:

      • 不,FK 名称必须是唯一的,句号。此外,FK 不是键,因此使用“键”作为 FK 的简写会令人困惑。
      • @philipxy - 由于 FK 更具体,我更新了以进一步清晰,但外键根据定义是一种键。它不是主键,也不是唯一键,但它是键。键是访问数据的快捷方式的值,而 FK 就是这样的设备。
      • 不,它的名字中只有“key”这个词。密钥是特定的不同事物,而 FK 不是。法式吐司不是吐司。 (超键是一组唯一的列。键是不包含更小的超键的超键。在 SQL PK/KEY/UNIQUE 中,所有超键都定义了,通常是键。)
      • @philipxy - 来自stackoverflow.com/questions/6951052/… - 键是单个字段或多个字段的组合。其目的是根据需要从表中访问或检索数据行。键在表中定义,以快速流畅地访问或排序存储的数据。它们还用于创建不同表之间的链接。外键建立了从一个表访问另一个表的索引路径,因此它是一个键。这也是一种关系。您对键的定义是什么?
      • 一个 FK 有点特别,因为它也是一个跨表约束,但这并不会使它成为一个键,即使它不是记录的键上。它是父表的键。
      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2017-11-27
      相关资源
      最近更新 更多