1

我有一个 oracle 表A,其中包含一个A.a用于存储表属性的列。这是一个有数据的大表。现在属性的语义需求A.a需要发展成另一个表B,B有一个id列,和一个B.a存储同组数据的A.a列(两列都是唯一的)。

所以现在A.a应该升级到表的外键B,然后A.a应该存储B.id而不是 VARCHAR2 并且更困难的部分是我需要使用通过A.a查找和重写,因为表 A 有现有数据。B.idB.aA.aB.id

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

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

4

1 回答 1

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;
于 2012-06-18T05:21:12.753 回答