【问题标题】:Refactor many-to-many relationship to many-to-one in Oracle在 Oracle 中将多对多关系重构为多对一
【发布时间】:2013-03-13 22:52:15
【问题描述】:

给定以下表格排列:

A - B - C

其中 B 是 A 和 C 之间的连接表。事实证明 A 和 C 之间的域关系确实是一对多的(A 侧有很多),我想重构我们的模式以反映这一事实。

是否可以编写一个 SQL UPDATE 语句将 C 的所有正确 id 插入 A 的正确行(A 的每一行将有一个 C id)?还是需要什么手续?

注意:我将接受仅限 Oracle 的答案,因为这是唯一需要进行迁移的地方。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    update tableA 
       set foreignKeyColumn = (
          select columnC 
             from tableB
             where columnA = tableA.columnA
       );
    

    实际上查看完整的表结构会更容易,但这应该可行。

    【讨论】:

    【解决方案2】:
    -- assuming you have tableA (id_a), tableB (id_a,id_c), tableC (id_c)
    
    alter table tableA add id_c int;
    alter table tableA add constraint foreign key (id_c) references tableC(id_c);
    
    merge into tableA a
    using tableB b
    on (a.id_a = b.id_a)
    when matched then update set
      a.id_c = b.id_c;
    
    commit;
    

    【讨论】:

      【解决方案3】:

      当然

      Alter Table C Add FK2A int Null
      Update C Set c.FK2A =
            (Select FK2A From B
             Where FK2C = C.PK)
      Alter Table C Alter Column FK2A int Not Null
      Alter Table C Add Constraint FKTableCToA 
                    Foreign Key (FK2A)
                    References A (PK)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        • 2018-06-15
        相关资源
        最近更新 更多