我是SQL的新手,我想开发一个数据库,我将有两个表(员工,商店)与父实体集的一对多关系" shop"到子实体集"员工"。如何在SQL(javaDB,Apache Derby)中创建约束,以检查每个商店是否必须至少有一个或多个员工,并且每个员工必须最多只能在一个商店工作。这只是一个例子,但我主要感兴趣的是在一对多关系中强制参与一方。我知道如何在子实体集(多方面)上创建关于父实体的约束但我想知道如何在父实体集(一侧)上创建关于子实体集的约束。
任何帮助都会有所帮助。此致
答案 0 :(得分:0)
根据您稍后要为两个表添加新记录所需的编码量,这可能不是一个可行的选择。我已经看到设计中有一个预定的工作,它检查Shop表并将没有任何员工的任何商店分配到另一个表,例如“Empty_Shops”。然后,在添加新员工时,您将扫描Shops以获取员工的shop_id,如果它不存在,请扫描Empty_Shops表以查找该shop_id,并在添加新员工之前将缺少的shop_id移回商店。
那就是说,我不知道如何完成你所要求的仅使用约束而不会像@Kell所提到的那样进入循环引用。
答案 1 :(得分:0)
如果您使用支持可延迟外键的数据库(如Postgresql),那么您可以这样做。您需要在父表插入上触发器。
不确定使用自动生成的密钥。
create table parent (
id int primary key
);
create function has_kids() returns trigger as $$
begin
if not exists (select 1 from child where parent_id = new.id) then
raise exception 'insert a child first';
end if;
return new;
end $$ language plpgsql;
CREATE TRIGGER has_kids BEFORE INSERT ON parent
FOR EACH ROW EXECUTE PROCEDURE has_kids();
create table child (
id int primary key,
parent_id int not null references parent(id) initially deferred deferrable
);
begin transaction;
insert into child (id, parent_id) values (1, 1);
insert into parent (id) values (1);
commit;