Sql 最近参加了一次采访。无法回答这个问题,你能帮我吗

Sql 最近参加了一次采访。无法回答这个问题,你能帮我吗,sql,oracle,plsql,oracle11g,data-modeling,Sql,Oracle,Plsql,Oracle11g,Data Modeling,假设有两个表名 表A有两列col1和col2 表B有两列col3、col4 col1是主键,col3是依赖于col1的外键col4是主键,col2是依赖于col4的外键。因此,这两个表是相互依赖的 现在,我想在表-a中插入一条记录。(在oracle 11g中)我如何做到这一点呢?简单只要确保Col2包含表B的Col4中的值,并且Col1在表a中不存在。不知道所涉及列的数据类型确实会增加难度,但由于对如何获取数据似乎没有限制,这可能会起作用: insert into TableA select

假设有两个表名

  • 表A有两列col1和col2
  • 表B有两列col3、col4
col1
是主键,
col3
是依赖于
col1
的外键
col4
是主键,
col2
是依赖于
col4
的外键。因此,这两个表是相互依赖的


现在,我想在
表-a
中插入一条记录。(在oracle 11g中)我如何做到这一点呢?

简单只要确保Col2包含表B的Col4中的值,并且Col1在表a中不存在。不知道所涉及列的数据类型确实会增加难度,但由于对如何获取数据似乎没有限制,这可能会起作用:

insert into TableA select max(col1)||'0', max(col2) from TableA ;

只要col1是基于数字或字符的,这就可以工作。如果col1是其他数据类型,则可能会失败。

Simple只需确保Col2包含表B的Col4中的值,并且表a中不存在col1。如果不知道所涉及列的数据类型,则会更加困难,但是,由于对如何获取数据似乎没有限制,这可能会起作用:

insert into TableA select max(col1)||'0', max(col2) from TableA ;

只要col1是基于数字或字符的,这就可以工作。如果col1是其他数据类型,则可能会失败。

您可以将约束计算推迟到提交

ALTER TABLE table_1
  ADD CONSTRAINT fk_table_1 (col2 ) REFERENCES table_2( col4)
  INITIALLY DEFERRED DEFERRABLE;

这将把约束检查推迟到提交时间。

您可以将约束计算推迟到提交

ALTER TABLE table_1
  ADD CONSTRAINT fk_table_1 (col2 ) REFERENCES table_2( col4)
  INITIALLY DEFERRED DEFERRABLE;

这将把约束检查推迟到提交时间。

简而言之,您不能。也就是说,如果不将记录插入
表a
,则无法将记录插入
表B

面试官可能希望的是:

既然我们需要同时向两个表中插入记录,我们可以这样做吗

否:
insert all
语法将在违反
ORA-02291:integrity constraint(完整性约束)时失败-未找到父密钥

insert all
   into table_a values (n1, n2)
   into table_b values (n2, n1)
select 23 as n1
       , 42 as n2
from dual
/
解决方法是更改外键,使其延迟:

alter table table_a add constraint ab_fk foreign key (col2)
     references table_b (col4) INITIALLY DEFERRED DEFERRABLE;
alter table table_b add constraint ba_fk foreign key (col3)
     references table_a (col1) INITIALLY DEFERRED DEFERRABLE;
正确答案(尽管只推荐给最有把握的候选人):

你为什么问我关于一个坏数据模型的问题?这是否意味着如果我加入贵公司,我将从事的工作

因为这是完全错误的情况。两个外键的作用是在
表a
表b
之间建立1:1的关系。那为什么它们是两张分开的桌子呢?让他们成为一个,问题就消失了。这实现了同样的目的:

alter table table_a add constraint ab_uk unique (col2);
drop table table_b;

假设确实需要两个表(即,如果有比本例中显示的更多的列),则选择一个表作为父表,并将另一个表作为子表。因为一旦我们以这种方式表达了这个模型,我们就会明白为什么它是如此错误:没有孩子是自己的父母,即使是在最扭曲的科幻故事中也是如此

简而言之,你不能。也就是说,如果不将记录插入
表a
,则无法将记录插入
表B

面试官可能希望的是:

既然我们需要同时向两个表中插入记录,我们可以这样做吗

否:
insert all
语法将在违反
ORA-02291:integrity constraint(完整性约束)时失败-未找到父密钥

insert all
   into table_a values (n1, n2)
   into table_b values (n2, n1)
select 23 as n1
       , 42 as n2
from dual
/
解决方法是更改外键,使其延迟:

alter table table_a add constraint ab_fk foreign key (col2)
     references table_b (col4) INITIALLY DEFERRED DEFERRABLE;
alter table table_b add constraint ba_fk foreign key (col3)
     references table_a (col1) INITIALLY DEFERRED DEFERRABLE;
正确答案(尽管只推荐给最有把握的候选人):

你为什么问我关于一个坏数据模型的问题?这是否意味着如果我加入贵公司,我将从事的工作

因为这是完全错误的情况。两个外键的作用是在
表a
表b
之间建立1:1的关系。那为什么它们是两张分开的桌子呢?让他们成为一个,问题就消失了。这实现了同样的目的:

alter table table_a add constraint ab_uk unique (col2);
drop table table_b;
假设确实需要两个表(即,如果有比本例中显示的更多的列),则选择一个表作为父表,并将另一个表作为子表。因为一旦我们以这种方式表达了这个模型,我们就会明白为什么它是如此错误:没有孩子是自己的父母,即使是在最扭曲的科幻故事中也是如此