【问题标题】:Can a primary key of a subclass table be referenced as a foreign key?子类表的主键可以作为外键引用吗?
【发布时间】:2021-09-06 10:41:37
【问题描述】:

我目前正在为我的班级开发一个 mysql 项目,我想知道是否可以将子类表的 PK-FK 引用为另一个表的 FK 而不是父类的 PK。

假设我有子类表employees写成:

CREATE TABLE employees (
    Person_ID int PRIMARY KEY,
    Designation varchar(50),
    FOREIGN KEY (Person_ID) REFERENCES persons(Person_ID));

至于父类,

CREATE TABLE persons (
    Person_ID int NOT NULL AUTO_INCREMENT,
    Last_Name varchar(255),
    Middle_Name varchar(255),
    First_Name varchar(255),
    PRIMARY KEY(Person_ID));

假设我想创建另一个表 works,其 FK 引用来自子类 employees 的 Person_ID,而不是父类 persons。 p>

CREATE TABLE works (
    project_ID PRIMARY KEY,
    date_started date,
    FOREIGN KEY (Person_ID) REFERENCES employees(Person_ID));

谢谢!

【问题讨论】:

  • 在数据库中没有“类”和“子类”之类的东西。有桌子。
  • mysql 没有身份
  • @nbk 啊,我的错。会更新的。
  • @Alejandro 是的,也许我应该换个说法,但我指的是泛化/专业化的概念。

标签: mysql database ddl


【解决方案1】:

是的,这在技术上是可行的(我猜你已经测试过了),并且在你的这种情况下逻辑上也可以。事实上,如果从逻辑上讲,只有员工可以参与“工作”关系,那么引用 persons 是错误的—— FK 约束不能确保他们只是员工。

【讨论】:

  • 我明白了,很高兴听到这个消息。谢谢!实际上我还没有测试它,因为我只是在一个word文件上手动编码它并且还没有创建数据库^^
  • @mariefherv:旁注:o_O 不要使用 Word!使用一些纯文本编辑器(我可以推荐 SciTE,但有很多可供选择。即使是纯 Windows 记事本也比 Word 好。)。 Word 有用“花哨”版本替换某些字符的习惯,例如引号和破折号。如果你然后复制并粘贴代码表单并在那里执行它,你会因此而得到错误。
  • 哈哈是的,别担心!我主要使用 Sublime,这只是我在活动中使用 Word 的少数实例之一,因为我们的讲师要求它在 PDF 文件中。 ^^
【解决方案2】:

没问题,但你总是检查id是否存在。

环形连接可能会导致问题。

CREATE TABLE persons (
    Person_ID int AUTO_INCREMENT,
    Last_Name varchar(255),
    Middle_Name varchar(255),
    First_Name varchar(255),
    PRIMARY KEY(Person_ID));
CREATE TABLE employees (
    Person_ID int PRIMARY KEY,
    Designation varchar(50),
    foreign key (Person_ID) REFERENCES persons(Person_ID));
CREATE TABLE works (
    project_ID Int PRIMARY KEY,
    date_started date,
    Person_ID int,
    FOREIGN KEY (Person_ID) REFERENCES employees(Person_ID));
INSERT INTo persons VALUES (NULL,'A','B','C')
INSERT INTO employees VALUES (1,'test')
INSERT INTO works  VALUES (1,NOW(),1)

db小提琴here

【讨论】:

  • 啊,我发现我忘记在我的 PK 中为个人添加 NOT NULL。另外,感谢您推荐该工具!这是一个很大的帮助,因为我还没有数据库来测试它。 ^^ 干杯!
猜你喜欢
  • 2013-07-12
  • 2014-08-07
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多