Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 向数据库生成数据_Sql_Oracle_Data Generation - Fatal编程技术网

Sql 向数据库生成数据

Sql 向数据库生成数据,sql,oracle,data-generation,Sql,Oracle,Data Generation,我有一个关于将数据生成到Database的问题。一般来说,我没有问题,但我不知道如何生成正确的外键。我有三张表:工厂、工人和产品。表Product有两个外键:toFactory和toWorker,表Worker有主键to Worker和外键toFactory,所以如果我首先生成产品数据,我就在Factory和Worker之间建立了链接,那么我如何才能genereta日期是否现在为工作人员?如果启用了外键,则必须先插入父记录,然后插入子记录 SQL> create table factory

我有一个关于将数据生成到Database的问题。一般来说,我没有问题,但我不知道如何生成正确的外键。我有三张表:工厂、工人和产品。表Product有两个外键:toFactory和toWorker,表Worker有主键to Worker和外键toFactory,所以如果我首先生成产品数据,我就在FactoryWorker之间建立了链接,那么我如何才能genereta日期是否现在为工作人员?

如果启用了外键,则必须先插入父记录,然后插入子记录

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>
正如您所说的,您不能首先将值插入
产品
,因为父行尚不存在:

SQL> rollback;

Rollback complete.

SQL> insert into product values (1000, 1, 100);
insert into product values (1000, 1, 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, 1, 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的表之前填充该表

因此,您需要按以下顺序生成数据:

  • 工厂
  • 工人
  • 产品

  • 您是否试图找到一种方法来获取上次插入记录的id,以便将其应用于下一次插入?不清楚您的问题到底是什么。为什么上次插入记录?如果有两个或三个表具有相同的键,则无法向第二个表生成随机数据,因为在第一个表中,您创建了键之间的链接。一般来说,是的,但并非所有情况下都是这样(提示:可延迟约束),请参见我的示例。不幸的是,这并不能解决我的问题。这可以防止插入带有错误键的数据,但我希望生成随机数据。如果有两个或三个表具有相同的键,则无法向第二个表生成随机数据,因为在第一个表中,您创建了键之间的链接。当然,您无法生成随机数据。您必须满足某些条件,这是为了保持引用完整性。因此,如果你遵循规则,你就脱离了“随机”领域。