如果你有以下模式:
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