2012-06-18 37 views
1

我有一个oracle表A其中包含一列A.a用于存储表的属性。这是一个有数据的大桌子。现在,属性A.a的语义需求需要发展到另一个称为B的表中,B具有id列,并且存储与A.a(两个列都是唯一的)相同的一组数据的列B.a如何使用sql查询将现有列升级到外键?

所以现在A.a应该升级到表B的外键,则A.a应存储B.id,而不是VARCHAR2,也是更困难的是,我需要通过B.a使用A.a找到B.idB.id,因为表改写A.a A有现有数据。

我必须通过SQL查询来实现这一点。

那么如何让这项工作?如果我没有说清楚,请道歉。请随时留下任何想法。提前致谢。

+1

你似乎在这里混淆了几个术语。当你提到一个“模式”时,我认为你的意思是“表”。查询意味着SQL,但查询本身并不强制执行外键约束。另外,PL/SQL是SQL的程序扩展,我认为它不适用于这个特定的问题。 –

+0

@Jeffrey Kemp感谢您的快速反馈。你是对的我应该说表或关系而不是模式,也使用SQL查询而不是PL/SQL。感谢您的支持。 – Dreamer

回答

4

如果你有以下模式:

tableA { a, x } 

你想把它转换成以下模式:

tableB { id, a } 
tableA { id, x } where id has a FK constraint to tableB (id) 

你可以用类似下面的命令序列做到这一点:

-- sequence to generate the tableB's surrogate key 
CREATE SEQUENCE tableB_id_seq; 

-- generate tableB 
CREATE TABLE tableB AS 
    SELECT tableB_id_seq.NEXTVAL AS id, a 
    FROM (SELECT DISTINCT a 
     FROM tableA); 

ALTER TABLE tableB MODIFY (id PRIMARY KEY); 

-- add the FK column on tableA 
ALTER TABLE tableA ADD (id NUMBER); 

-- populate it 
UPDATE tableA SET id = 
    (SELECT tableB.id 
    FROM tableB 
    WHERE tableB.a = tableA.a); 

-- make it a FK 
ALTER TABLE tableA ADD CONSTRAINT afk 
    FOREIGN KEY (id) REFERENCES tableB (id); 

-- drop the old column 
ALTER TABLE tableA DROP COLUMN a; 
+0

很好的答案:D谢谢。 – Dreamer

相关问题