1

给定下表排列:

A - B - C

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

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

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

4

3 回答 3

2
update tableA 
   set foreignKeyColumn = (
      select columnC 
         from tableB
         where columnA = tableA.columnA
   );

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

于 2013-03-13T14:07:19.447 回答
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;
于 2013-03-13T14:09:54.197 回答
1

当然

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)
于 2013-03-13T14:10:57.907 回答