【问题标题】:create entry in child table only if the foreign key from the child table has a value assigned to it in parent table仅当子表中的外键在父表中具有分配给它的值时,才在子表中创建条目
【发布时间】:2020-07-21 11:51:38
【问题描述】:

我有这两张表:

create table employeetasks (
    employeeid int not null,
    projectid int not null,
    taskcode char(1),
    primary key (employee, projectid)
);

create table workinghoursperday (
    employeeid int not null,
    projectid int not null,
    date date not null,
    hours float,
    primary key (employeeid, projectid, date),
    foreign key (employeeid) references employeetasks(employeeid),
    foreign key (projectid) references employeetasks(projectid)
);

在第二个表(名为 workinghoursperday 的子表)中,我想列出每个员工每天在特定项目上工作的小时数,但为了记录员工在该项目上特定日期的工作小时数,employeeid 必须在父表(employeetasks)中为他们分配了一个任务代码。

例如在父表(employeetasks)中我们可以有两个条目:

FIRST ENTRY:      employeeid | projectid | taskcode
                       1     |     1     |   'A'


SECOND ENTRY:     employeeid | projectid | taskcode
                       2     |     1     |   null

假设我想在子表(workinghoursperday)中创建这两个条目:

FIRST ENTRY:       employeeid | projectid |     date     | hours
                        1     |     1     | '2020-04-09' | 6.5


SECOND ENTRY:      employeeid | projectid |     date     | hours
                        2     |     1     | '2020-04-10' | 7.5

我希望子表中的第一个条目成功,因为employeeid 1 在projectid 1 上分配了一个任务代码(在本例中为'A'),但是子表中的第二个条目应该失败,因为employeeid 2 没有'在 projectid 1 上没有分配任务代码(因为值为 null)。

我不知道该怎么做。非常感谢任何帮助!

【问题讨论】:

  • 制作taskcode NOT NULL并使用FK (employeeid, projectid)
  • 感谢您的回答,问题是任务代码不能不为空,因为在某些情况下它必须为空。我的子表中已经有employeeid 和projectid 作为外键。
  • 你有两个独立的 FKs,和一个(employeeid, projectid)不一样
  • 另外,NULL 可能意味着您将employeetask 表用于两个不同的含义(谓词),可能会导致逻辑错误。
  • 哇,我什至不知道如果你组合这些键,它们会产生不同的结果。你的意思是我应该在我的工作时间表中包含列任务代码,或者只是引用它而不使其成为子表中的列?我需要能够在employeetask中将taskcode留空,所以我不知道如果不使用null,我该怎么做

标签: mysql database-design foreign-keys create-table


【解决方案1】:

从存在谓词开始,以创建一个“完整的”逻辑故事(模型)。选择其中的部分来调整您的示例。

-- Employee EMP exists.
--
employee {EMP}
      PK {EMP}

-- Project PRO exists.
--
project {PRO}
     PK {PRO}

-- Task TSK exists.
--
task {TSK}
  PK {TSK}
-- Project PRO contains task TSK.
--
project_task {PRO, TSK}
          PK {PRO, TSK}

FK1 {PRO} REFERENCES project {PRO}
FK2 {TSK} REFERENCES task    {TSK}
-- Employee EMP is allocated to project PRO.
--
employee_project {EMP, PRO}
              PK {EMP, PRO}

FK1 {EMP} REFERENCES employee {EMP}
FK2 {PRO} REFERENCES project  {PRO}
-- Employee EMP is assigned task TSK of project PRO.
--
employee_task {EMP, PRO, TSK}
           PK {EMP, PRO, TSK}

FK1 {EMP, PRO} REFERENCES employee_project {EMP, PRO}
FK2 {PRO, TSK} REFERENCES project_task     {PRO, TSK}

按员工项目任务跟踪每日工时。

-- On date DTE, employee EMP worked HRS hours
-- on task TSK of project PRO.
--
task_hours_day {EMP, PRO, TSK, DTE, HRS}
            PK {EMP, PRO, TSK, DTE}

           FK {EMP, PRO, TSK} REFERENCES
employee_task {EMP, PRO, TSK}

对于每日员工项目时间,创建一个视图。

-- On date DTE, employee EMP worked HRS_PRO hours
-- on project PRO.
--
-- {EMP, PRO, DTE} -- logical KEY
--
CREATE VIEW project_hours_day
AS
SELECT EMP, PRO, DTE, sum(HRS) AS HRS_PRO
FROM task_hours_day
GROUP BY EMP, PRO, DTE ;

注意:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key

【讨论】:

  • 非常感谢,您帮了大忙!非常感谢您与像我这样的菜鸟分享您广泛的 mysql 知识!
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
相关资源
最近更新 更多