Sql 向数据库生成数据
我有一个关于将数据生成到Database的问题。一般来说,我没有问题,但我不知道如何生成正确的外键。我有三张表:工厂、工人和产品。表Product有两个外键:toFactory和toWorker,表Worker有主键to Worker和外键toFactory,所以如果我首先生成产品数据,我就在Factory和Worker之间建立了链接,那么我如何才能genereta日期是否现在为工作人员?如果启用了外键,则必须先插入父记录,然后插入子记录Sql 向数据库生成数据,sql,oracle,data-generation,Sql,Oracle,Data Generation,我有一个关于将数据生成到Database的问题。一般来说,我没有问题,但我不知道如何生成正确的外键。我有三张表:工厂、工人和产品。表Product有两个外键:toFactory和toWorker,表Worker有主键to Worker和外键toFactory,所以如果我首先生成产品数据,我就在Factory和Worker之间建立了链接,那么我如何才能genereta日期是否现在为工作人员?如果启用了外键,则必须先插入父记录,然后插入子记录 SQL> create table factory
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,以便将其应用于下一次插入?不清楚您的问题到底是什么。为什么上次插入记录?如果有两个或三个表具有相同的键,则无法向第二个表生成随机数据,因为在第一个表中,您创建了键之间的链接。一般来说,是的,但并非所有情况下都是这样(提示:可延迟约束),请参见我的示例。不幸的是,这并不能解决我的问题。这可以防止插入带有错误键的数据,但我希望生成随机数据。如果有两个或三个表具有相同的键,则无法向第二个表生成随机数据,因为在第一个表中,您创建了键之间的链接。当然,您无法生成随机数据。您必须满足某些条件,这是为了保持引用完整性。因此,如果你遵循规则,你就脱离了“随机”领域。