【问题标题】:Recently attended one interview. Unable to answer this one, can you help me out最近参加了一次采访。无法回答这个问题,你能帮帮我吗
【发布时间】:2018-10-19 17:58:05
【问题描述】:

假设有两个表名,例如

  • 表 A 有两列 col1,col2。
  • Table-B 有两列 col3,col4。

col1 是主键,col3 是依赖于col1 的外键。 col4 是主键,col2 是依赖于col4 的外键。因此,这两个表都是相互依赖的。

现在,我想在table-A 中插入一条记录。我该怎么做(在 oracle 11g 中)?

【问题讨论】:

    标签: sql oracle plsql oracle11g data-modeling


    【解决方案1】:

    简短的回答是,你不能。也就是说,您不能在不将记录插入Table_B 的情况下将记录插入Table_A

    面试官可能希望的是什么:

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

    不:insert all 语法将在 ORA-02291: integrity constraint WHATEVER_FK) violated - parent key not found 上失败

    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;
    

    正确答案(虽然只推荐给最有把握的候选人):

    您为什么要问我有关损坏的数据模型的问题?如果我加入贵公司,这是否表明我将从事的工作?

    因为这是一个完全错误的情况。这两个外键的作用是在table_atable_b 之间建立1:1 的关系。那么为什么它们是两个单独的表呢?让他们成为一个,问题就消失了。这达到了同样的效果:

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

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

    【讨论】:

      【解决方案2】:

      您可以将约束评估推迟到提交。

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

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

      【讨论】:

        【解决方案3】:

        只需确保 Col2 包含来自 Table-B 的 Col4 的值,并且 Col1 不存在于 Table-A 中。对所涉及的列的数据类型一无所知确实会使其变得更加困难,但由于您获取数据的方式似乎没有限制,这可能会起作用:

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

        只要 col1 是基于数字或字符的,这将起作用。如果 col1 是其他数据类型,它可能会失败。

        【讨论】:

          猜你喜欢
          • 2022-11-14
          • 2022-06-28
          • 2011-01-24
          • 2021-08-14
          • 1970-01-01
          • 1970-01-01
          • 2019-01-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多