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