2012-06-18 72 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

相關問題