我可以在两个不同的表中使用相同的外键约束吗?

时间:2014-06-19 14:15:55

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

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

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

我意识到我可能创建一个单独的表,其中包含用户名和指向内部或外部的外键,但除此之外,我在内部表中添加了一个外键约束,引用{{1另一个内部用户。我叫它supv_id。当我尝试为我的外部用户表执行相同操作时,我得到了fk_supv_id

起初我无法弄清问题是什么,但是当我尝试使用不同的名称时,它起作用(即不是像内部一样调用它ERROR 1005 (HY000),我称之为{ {1}})。

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

赞赏建议和建议,

谢谢! :)

2 个答案:

答案 0 :(得分:4)

有列和外键(FK)并且存在约束。

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

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

作为约束的FK约束是一个名称必须在数据库上唯一的东西。它具有并强制执行相关的FK,即其声明中描述的FK。您可以在强制执行相同FK的表中使用多个FK约束。

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

如果要为其命名,则应该有一个唯一的命名方案。应该引用引用和引用的表名,并在必要时区分列名。

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

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

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

答案 1 :(得分:3)

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