生成数据到数据库

问题描述

我有一个关于向数据库生成数据的问题。通常我没有问题,但我不知道如何生成正确的外键。示例:我有三个表:Factory、Worker 和 Product。表 Product 有两个外键:to FactoryWorker,表 Worker 有 Worker 和外键的主键Factory 的关键,所以如果我首先将数据生成到 Product,我在 FactoryWorker 之间建立了链接,所以我如何才能将数据生成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 的表之前填充它。

所以你需要按顺序生成数据:

  1. 工厂
  2. 工人
  3. 产品

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...