如果你有以下模式:
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;
你似乎在這裏混淆了幾個術語。當你提到一個「模式」時,我認爲你的意思是「表」。查詢意味着SQL,但查詢本身並不強制執行外鍵約束。另外,PL/SQL是SQL的程序擴展,我認爲它不適用於這個特定的問題。 –
@Jeffrey Kemp感謝您的快速反饋。你是對的我應該說表或關係而不是模式,也使用SQL查詢而不是PL/SQL。感謝您的支持。 – Dreamer