簡體   English   中英

PostgreSQL:現有表中新表中的外鍵

[英]PostgreSQL: Foreign key in new tables from existing table

我是Postgresql和Python的新手,在理解外鍵時遇到了一些問題(我認為這是我在這里使用的)。 我看過這里的一個例子,但我認為那不是我真正需要的

作為一個簡單的示例,我在現有表中有一些信息:

    [ID      REFERENCE     REF_AGE   DATA1      DATA 2]
    [1       JOHN          50        50         60    ]
    [2       JOHN          50        55         30    ]
    [3       TOM           60        60         10    ]
    [4       MATT          30        76         57    ]
    [5       MATT          30        45         47    ]

我要據此制作兩個新表。 其中一個包含ID和帶有reference_id的數據,該reference_id鏈接到另一個新表-參考表,我可以在其中存儲有關每個參考的其他信息(例如,上述年齡)。

表格1:

    [ID      REF_ID        DATA1      DATA 2]
    [1       1             50         60    ]
    [2       1             55         30    ]
    [3       2             60         10    ]
    [4       3             76         57    ]
    [5       3             45         47    ]

表2:

    [REF_ID     NAME    AGE  ]
    [1          JOHN    50   ]
    [2          TOM     60   ]
    [3          MATT    30   ]

誰能告訴我如何分割現有數據? 將唯一值從原始表引用列中分離到新引用表中,並將相應的ref_id插入另一個新表中?

有食譜。 但是,如果人名不是唯一的,則會遇到問題。

drop table if exists not_normalized cascade;
create table not_normalized (
    id int, reference text, ref_age int, data1 int, data2 int
);

insert into not_normalized (id, reference, ref_age, data1, data2) values
(1,'JOHN',50,50, 60    ),
(2,'JOHN',50,55, 30    ),
(3,'TOM',60,60, 10    ),
(4,'MATT',30,76, 57    ),
(5,'MATT',30,45, 47    ),
(6,null,null,42,50);

drop table if exists referenced cascade;
create table referenced (
    ref_id serial primary key,
    name text,
    age int
);

選擇不同的對(名稱,年齡)可以最大程度地減少名稱沖突問題:

insert into referenced (name, age)
select distinct reference, ref_age
from not_normalized
where (reference, ref_age) is not null
;
table referenced;
 reference | ref_age 
-----------+---------
 JOHN      |      50
 TOM       |      60
 MATT      |      30

drop table if exists referencer;
create table referencer (
    id serial primary key,
    ref_id int references referenced (ref_id),
    data1 int, data2 int
);

再次使用年齡最小化碰撞:

insert into referencer (ref_id, data1, data2)
select r.ref_id, data1, data2
from
    not_normalized nn
    left join
    referenced r on r.name = nn.reference and r.age = nn.ref_age
;
table referencer;
 id | ref_id | data1 | data2 
----+--------+-------+-------
  1 |      1 |    50 |    60
  2 |      1 |    55 |    30
  3 |      3 |    76 |    57
  4 |      3 |    45 |    47
  5 |      2 |    60 |    10
  6 |        |    42 |    50

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM