我有两张桌子。一个是员工,另一个是部门。因此,第一种关系是一对多的关系,其中1名员工可以在一个部门工作,但一个部门可以有多名员工。因此,我们将外键放在employee表中。
第二种关系也是1比多的关系,尽管它是可选的。这是一种管理关系。因此,一个员工(可选的,因为不是每个员工都这样做)可以管理一个或多个部门,但是一个部门由一个员工管理。因此外键在部门。
create table dept(
departmentName varchar2(10),
mgrId integer,
primary key(departmentName),
foreign key mgrId references employee(empId)
);
create table employee(
empId integer;
empName varchar2(100),
departmentName varchar2(10),
primary key(empId),
foreign key(departmentName) references dept(departmentName));从技术上讲,这是我想要的,但我知道我会得到一个错误,因为我所引用的其中一个表还没有创建。所以我应该只保留一段不是可选的关系吗?还是我应该为经理们做一张单独的桌子?
发布于 2018-12-30 21:56:15
您可以首先创建两个表,然后添加约束。
然而,这种设计的问题在于,不仅在创建表时,而且在插入或更新数据时,相互依赖关系都会导致问题。在执行更新或插入时,总是可以暂时禁用约束,但如果需要重复太频繁,则会变得单调乏味。
为了避免这种情况,您可以按照建议创建一个单独的表来处理经理关系。
Note
甚至还可以将员工部门存储在另一个单独的表中,而不是在员工中作为外键存储。虽然这将为这两种关系提供一致的解决方案,但这可能不是一个好的设计选择:正如@APC所评论的那样,执行一个表必须有一个子表的规则是很棘手的,因此这类表的数量应该保持在最低限度。
发布于 2018-12-30 21:56:08
可以在创建表后添加外键以跳过错误。
https://stackoverflow.com/questions/53981692
复制相似问题