在Oracle SQL中,SQL Developer:我正在尝试创建两个表,每个表都有一个引用另一个表的主键的外键。
使用我的逻辑,我无法设置外键引用,因为另一个表尚不存在。
这是我如何进行结构化的一般概念:
CREATE TABLE table1
(
column1 datatype PRIMARY KEY NOT NULL,
column2 datatype NOT NULL,
column3 datatype NOT NULL,
CONSTRAINT fk_keyname
FOREIGN KEY (colmn3)
REFERENCES otherTable (column3)
);
CREATE TABLE table2
(
column1 datatype PRIMARY KEY NOT NULL,
column2 datatype NOT NULL,
column3 datatype NOT NULL,
CONSTRAINT fk_keyname2
FOREIGN KEY (colmn3)
REFERENCES otherTable2 (column3)
);
我遇到错误
ORA-00942:表或视图不存在
我之前通过先创建父表来解决此问题,但由于它们彼此引用,我很茫然,因为在这种特殊情况下必须互相引用。
答案 0 :(得分:5)
您可以先创建表,然后创建FK。例如:
create table table1 (
column1 int primary key not null,
column2 int not null,
column3 int not null
);
create table table2 (
column1 int primary key not null,
column2 int not null,
column3 int not null,
constraint fk2
foreign key (column3)
references table1 (column1)
);
alter table table1 add constraint fk1
foreign key (column3)
references table1 (column1);
即使将创建表,您也将无法在其中插入数据,因为约束将阻止您创建不指向另一行(不存在)的行。为了插入数据,您需要将约束创建为“可延迟”。这是改进的 SQL脚本:
create table table1 (
column1 int primary key not null,
column2 int not null,
column3 int not null
);
create table table2 (
column1 int primary key not null,
column2 int not null,
column3 int not null,
constraint fk2
foreign key (column3)
references table1 (column1) deferrable initially deferred
);
alter table table1 add constraint fk1
foreign key (column3)
references table1 (column1) deferrable initially deferred;
现在,确保在事务边界之间插入所有涉及表的行。现在将仅在交易结束时检查约束,而不会在每个插入/修改/删除的行中检查约束。
答案 1 :(得分:1)
从技术角度来看,可以创建没有外键约束的第一个表,然后创建具有外键的第二个表,最后将外键约束添加到第一个表。
但是您遇到的问题确实表明存在设计问题。它也预示了您尝试填充表时将要解决的问题:由于使用了交叉的外键,因此您无法INSERT
记录表中的记录,除非您执行一些复杂的操作(例如临时禁用一个表)约束,将其插入两个表中,更新第一个表,然后启用约束。
您的问题给我的背景信息不足,无法为您提供替代设计的建议,但是,根据经验,肯定存在更好的解决方案。它可能涉及到只有一个表而不是两个表(如果要处理1-1关系),或者如果有N-M关系,则要有第三个表充当桥表。