【发布时间】: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