1

テーブルの属性を格納するために使用されるA列を含むオラクルテーブルがあります。A.aこれは、データを含む大きなテーブルです。ここで、属性のセマンティック要件をA.aB という別のテーブルに展開する必要があります。B には id 列とB.a、同じデータ セットを格納するA.a列があります (両方の列が一意です)。

したがって、テーブルのA.a外部キーにアップグレードし、 VARCHAR2の代わりに保存する必要があります。また、テーブルAには既存のデータがあるため、経由で検索して書き換えるために使用する必要があるのは、より難しい部分です。BA.aB.idA.aB.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 に答える