问题描述
我有一个关于向数据库生成数据的问题。通常我没有问题,但我不知道如何生成正确的外键。示例:我有三个表:Factory、Worker 和 Product。表 Product 有两个外键:to Factory 和 Worker,表 Worker 有 Worker 和外键的主键Factory 的关键,所以如果我首先将数据生成到 Product,我在 Factory 和 Worker 之间建立了链接,所以我如何才能将数据生成到 Worker 现在?
解决方法
如果启用了外键,则必须先插入父记录,然后再插入子记录。
SQL> create table factory
2 (id number primary key);
Table created.
SQL> create table worker
2 (id number primary key,3 id_fact number references factory
4 );
Table created.
SQL> create table product
2 (id number primary key,3 id_fact number references factory,4 id_work number references worker
5 );
Table created.
SQL>
SQL> insert into factory values (1);
1 row created.
SQL> insert into worker values (100,1);
1 row created.
SQL> insert into product values (1000,1,100);
1 row created.
SQL>
您不能 - 正如您所说 - 首先将值插入到 product
中,因为尚不存在父行:
SQL> rollback;
Rollback complete.
SQL> insert into product values (1000,100);
insert into product values (1000,100)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.SYS_C007766) violated - parent key not
found
SQL>
如果您创建了可延迟的外键约束,那么您可以按您想要的任何顺序插入行,因为 Oracle 将在提交时检查完整性:
SQL> create table factory
2 (id number primary key);
Table created.
SQL> create table worker
2 (id number primary key,3 id_fact number references factory initially deferred deferrable
4 );
Table created.
SQL> create table product
2 (id number primary key,3 id_fact number references factory initially deferred deferrable,4 id_work number references worker initially deferred deferrable
5 );
Table created.
SQL> insert into product values (1000,100);
1 row created.
SQL> insert into factory values (1);
1 row created.
SQL> insert into worker values (100,1);
1 row created.
SQL>
,
您需要以正确的顺序为表生成数据:如果表被 FK 引用,则需要在包含 FK 的表之前填充它。
所以你需要按顺序生成数据:
- 工厂
- 工人
- 产品