2013-09-16 76 views
2

如何創建具有循環引用的多個表格。我有這個數據,我想創建在一個鏡頭:使用循環引用創建表格

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) 
); 

請幫助!

+0

你有什麼理由不能運行它?你是否收到錯誤代碼? –

+0

不知道是誰投票結束這個問題而不留言,但我認爲這是個好問題。您可能想重新考慮department.mgrssn上的非空限制。如果一個經理離開,他是否100%地被替換掉了?否則,您的數據模型不支持業務需求。 –

+0

@DavidStarkey,代碼不會運行,因爲員工和部門表互相引用。 –

回答

5

您可以創建的表,然後創建約束:

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; 

插入時,可以設置延遲的限制,這意味着甲骨文將無法驗證,直到你提交。

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; 

你也可以設置它們創建它們在最初推遲,但限制必須是「緩徵」在至少做以上。

+0

確保在添加約束之前,每個表中至少有一條記錄。否則,你有相同問題的不同版本。 –

+3

@DanBracuk如果您將它們設置爲最初延期,則不會有問題,請參閱我的補充答案。 – tbone

+0

你能證實這個答案嗎?如果你發佈答案,我會給你chk。 http://dba.stackexchange.com/a/58959/32234 – 2014-02-14 17:58:56