SQL中的一个(强制)到多个(强制)关系

时间:2013-12-13 18:24:56

标签: sql database entity-relationship relationship

我是SQL的新手,我想开发一个数据库,我将有两个表(员工,商店)与父实体集的一对多关系" shop"到子实体集"员工"。如何在SQL(javaDB,Apache Derby)中创建约束,以检查每个商店是否必须至少有一个或多个员工,并且每个员工必须最多只能在一个商店工作。这只是一个例子,但我主要感兴趣的是在一对多关系中强制参与一方。我知道如何在子实体集(多方面)上创建关于父实体的约束但我想知道如何在父实体集(一侧)上创建关于子实体集的约束。

任何帮助都会有所帮助。此致

2 个答案:

答案 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;