2012-01-07 19 views
0

テーブルA(ID)があります。新しいテーブルに挿入中に外部キーを更新する

私は

  • に、Aのすべての行の参照が
  • をB.IDすることをテーブルAへの外部キーを追加し、テーブルB(ID)
  • を作成Bに行を挿入必要とA.b_idをBで新しく挿入された行で更新する

Aを参照するBに一時列を追加せずに行うことはできますか?以下は動作しますが、私はむしろ一時的な列を作る必要はありません。

と仮定すると
alter table B add column ref_id integer references(A.id); 
insert into B (ref_id) select id from A; 
update A set b_id = B.id from B where B.ref_id = A.id; 
alter table B drop column ref_id; 
+0

INSERT INTO B (id) SELECT b_id FROM A; 
  • FOREIGN KEY制約を追加します。あまりにも多くのids。 –

  • +0

    質問はあまりにも混乱ですか? –

    +1

    あなたの質問は理にかなっていません。あなたは**本当に**達成しようとしていますか? –

    答えて

    1

    :B.idはシリアル(NEXTVAL( 'b_id_seq' のデフォルト値を持つので、実際にはint型)である)あなたは、PostgreSQL 9.1

    2を使用している

    1)

    3)Bに挿入するときに、あなたが実際にそうでない場合、挿入は無用であるから

    ...私はこのような何かが仕事だと思う他のフィールドを追加します。

    with n as (select nextval('b_id_seq') as newbid,a.id as a_id from a), 
        l as (insert into b(id) select newbid from n returning id as b_id) 
    update a set b_id=l.b_id from l,n where a.id=n.a_id and l.b_id=n.newbid; 
    
    +0

    なぜ3ですか(他の列がない場合、挿入は役に立たない)?CTEに関する良い考え、私はそれを試してみましょう。 –

    +0

    SQLの 'B(ref_id)への挿入'とref_idを取り除くことを考えると、B.ref_idがない場合はどの列に挿入しますか? –

    +0

    B.id. –

    0
    1. 将来の外部キー列が、制約自体せずに追加します。他のテーブルを作成します

      WITH cte AS (
          SELECT 
          id 
          ROW_NUMBER() OVER (ORDER BY id) AS b_ref 
          FROM A 
      ) 
      UPDATE A 
      SET b_id = cte.b_ref 
      FROM cte 
      WHERE A.id = cte.id; 
      
    2. :値を持つ新しい列を記入

      ALTER TABLE A ADD b_id integer; 
      
    3. を:

      CREATE TABLE B (
          id integer CONSTRAINT PK_B PRIMARY KEY 
      ); 
      
    4. 既存の参照列を使用して新しいテーブルに行を追加します。あなたは私を倒す

      ALTER TABLE A 
      ADD CONSTRAINT FK_A_B FOREIGN KEY (b_id) REFERENCES B (id); 
      
    関連する問題