创建具有循环引用的表格

4

我该如何创建具有循环引用的多个表格。我想一次性创建以下数据:

DROP TABLE employee CASCADE CONSTRAINTS;
CREATE TABLE employee (
  fname    varchar2(15) not null, 
  minit    varchar2(1),
  lname    varchar2(15) not null,
  ssn      char(9),
  bdate    date,
  address  varchar2(30),
  sex      char,
  salary   number(10,2),
  superssn char(9),
  dno      number(4),
  primary key (ssn),
  foreign key (superssn) references employee(ssn),
  foreign key (dno) references department(dnumber)
);

DROP TABLE department CASCADE CONSTRAINTS;
CREATE TABLE department (
  dname        varchar2(15) not null,
  dnumber      number(4),
  mgrssn       char(9) not null, 
  mgrstartdate date,
  primary key (dnumber),
  unique (dname),
  foreign key (mgrssn) references employee(ssn)
);

DROP TABLE dept_locations CASCADE CONSTRAINTS;
CREATE TABLE dept_locations (
  dnumber   number(4),
  dlocation varchar2(15), 
  primary key (dnumber,dlocation),
  foreign key (dnumber) references department(dnumber)
);

DROP TABLE project CASCADE CONSTRAINTS;
CREATE TABLE project (
  pname      varchar2(15) not null,
  pnumber    number(4),
  plocation  varchar2(15),
  dnum       number(4) not null,
  primary key (pnumber),
  unique (pname),
  foreign key (dnum) references department(dnumber)
);

DROP TABLE works_on CASCADE CONSTRAINTS;
CREATE TABLE works_on (
  essn   char(9),
  pno    number(4),
  hours  number(4,1),
  primary key (essn,pno),
  foreign key (essn) references employee(ssn),
  foreign key (pno) references project(pnumber)
);

DROP TABLE dependent CASCADE CONSTRAINTS;
CREATE TABLE dependent (
  essn           char(9),
  dependent_name varchar2(15),
  sex            char,
  bdate          date,
  relationship   varchar2(8),
  primary key (essn,dependent_name),
  foreign key (essn) references employee(ssn)
);

请帮忙!!

你无法运行这个吗?是不是出现了错误代码? - David Starkey
不确定是谁投票关闭了这个问题,也没有留下评论,但我认为这是一个好问题。你可能需要重新考虑对department.mgrssn的非空约束。如果经理离开,他是否总是立即被100%替换?如果不是,你的数据模型就不支持业务需求。 - Dan Bracuk
@DavidStarkey,代码无法运行,因为员工和部门表相互引用。 - Dan Bracuk
@DAn,啊,谢谢您指出这个问题。也许我们应该简化这个问题,以便关注这个问题。 - David Starkey
可能是在SQL表创建期间创建约束的其他方法吗?的重复问题。 - Jon Heller
1个回答

8

您可以先创建表,然后再创建约束:

CREATE TABLE employee (
  fname    varchar2(15) not null, 
  minit    varchar2(1),
  lname    varchar2(15) not null,
  ssn      char(9),
  bdate    date,
  address  varchar2(30),
  sex      char,
  salary   number(10,2),
  superssn char(9),
  dno      number(4),
  primary key (ssn)
);

CREATE TABLE department (
  dname        varchar2(15) not null,
  dnumber      number(4),
  mgrssn       char(9) not null, 
  mgrstartdate date,
  primary key (dnumber),
  unique (dname)
);

ALTER TABLE employee ADD CONSTRAINT fk_dno FOREIGN KEY (dno) REFERENCES department(dnumber) DEFERRABLE;
ALTER TABLE department ADD CONSTRAINT fk_mgrssn FOREIGN KEY (mgrssn) REFERENCES employee(ssn) DEFERRABLE;

当进行插入操作时,您可以将约束设置为延迟,这意味着Oracle直到提交之前不会验证它们。

ALTER SESSION SET CONSTRAINTS = DEFERRED;
insert into employee (fname, lname, ssn, dno) values ('Joe','Blow','123456789', 10);
insert into department(dname, dnumber, mgrssn) values ('Dept1',10, '123456789');
commit;

您还可以在创建时将它们最初设置为推迟,但至少约束必须是“可推迟的”,才能执行上述操作。


在添加约束之前,请确保每个表中至少有一条记录。否则,您将面临同一问题的不同版本。 - Dan Bracuk
3
@DanBracuk 如果你最初将它们设置为deferred(延迟),那就不是问题了,可以看一下我对答案的补充。 - tbone
你能确认这个答案吗?如果你发表一个答案,我会给你chk。http://dba.stackexchange.com/a/58959/32234 - user1382306
@Gracchus 你好,你的问题涉及到级联删除的行为(并且似乎是针对PostgreSQL的)。这个问题与使用延迟约束来完成插入相关。你是否尝试过设置一些需要级联删除的测试表并尝试删除?我目前没有访问PostgreSQL的权限。 - tbone
@tbone 谢谢您的关注!我希望在创建结构之后才考虑这个作为最后的手段。我宁愿继续推进我的设计,而不是测试是否可以得到答案,所以我想现在我会等待答案。 - user1382306

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接