是否可以将一个表中的主键引用为超过 2 个表的外键约束?

Posted

技术标签:

【中文标题】是否可以将一个表中的主键引用为超过 2 个表的外键约束?【英文标题】:Is it possible to reference a primary key in one table as a foreign key constraint across more than 2 tables? 【发布时间】:2014-08-27 09:32:15 【问题描述】:

我目前正在机场制作一个数据库后端系统,通过 phpmyadmin 服务器使用 sql。该标准并不完美,但查询背后的想法之一是想象客户或飞行调度员可能正在查看表格。我想知道是否可以在 2 个或更多表中引用主键作为外键。在下面的示例中,我想在底部 2 个表中引用型号作为外键。我已确保类型和字符数相同。

    CREATE TABLE Aircraft_Model
    (Model_Number varchar (12) NOT NULL,
    seat_capacity int (3),
    CONSTRAINT pk7 primary key (Model_Number));

    CREATE TABLE Licence_type
    (Rank varchar (25) NOT NULL,
    Model_Number varchar (12),
    CONSTRAINT pk9 primary key (Rank));

    CREATE TABLE Aircraft
    (Aircraft_ID varchar (4) NOT NULL, 
    Model_Number varchar(12),
    airport_base text(13),
    CONSTRAINT pk1 PRIMARY KEY (Aircraft_ID));

这可能吗?我只希望数据库能够执行大约 12-15 个简单查询。

添加外键的语法会是这样吗?

ALTER TABLE Aircraft
ADD CONSTRAINT fk1 FOREIGN KEY(Model_Number)
REFERENCES Aircraft_Model

从单独的表(例如 Licence_type)引用的相同外键是否需要添加单独的约束,或者是否可以从具有相同 fk1 编号的同一个表中添加?

【问题讨论】:

【参考方案1】:

我想知道是否可以引用主键作为 跨 2 个或更多表的外键。

如果您的意思是“两个或多个表可以具有引用同一列的外键吗?”那么,是的,您可以这样做。这似乎是您的意思,但不是大多数人在谈论“跨 2 个或更多表的外键”时的意思。

声明两个不同的独立约束。

ALTER TABLE Aircraft
ADD CONSTRAINT fk1 FOREIGN KEY(Model_Number)
REFERENCES Aircraft_Model (Model_Number);

ALTER TABLE License_Type
ADD CONSTRAINT fk2 FOREIGN KEY(Model_Number)
REFERENCES Aircraft_Model (Model_Number);

【讨论】:

这通常对数据库的有效性有影响吗?我意识到它可能会减慢速度,但它不会影响我认为的信息检索?仍然可以进行连接或使用选择命令来检查谁可以在特定日期飞行? 外键强制正确性。外键使一些插入和更新比没有外键时更慢,但只会冒引入坏数据的风险。 (支持外键的索引必须更新。)速度的变化对人类来说是不明显的。它们不会影响 SELECT 语句的性能,除非支持外键的索引恰好有用。任何没有外键约束的查询都是可能的。 (假设没有此类约束并没有破坏您的数据。) 我还没有运行任何查询,我希望约束尽可能正确。在 2 个表格中,“禁飞名单”和“乘客”,我将护照号码作为两者的主键。它也是“保留”中的外键。我已将其标记为仅用于“保留”和“禁飞列表”的外键 - 这是正确的还是需要在所有三个上都将其作为外键引用,无论它是否是主键?我想知道如果键不是主要的但在 2 个表中该怎么办 - 我在“飞机”表和“机组”表中有机场基地,但它不是主要的。它需要2个约束吗? FK 约束从一个表的列集到另一个表中的一组 unique 列。它们必须被声明为 PK 或 UNIQUE。它将第一个表中列集的每个值约束为另一个表中列集的值。在这种情况下,声明 FK。如果您不确定,请发布另一个问题。关于您帖子的最后一个问题,请参阅this。

以上是关于是否可以将一个表中的主键引用为超过 2 个表的外键约束?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 外键名称问题

今日刷题总结10

SQL怎么在有外键的主键表中插数据

使用 SQL 和 C# 将表 1 的主键分配为表 2 中的外键

谈谈mysql的主键和外键

SQL怎么在有外键的主键表中插数据