![](/img/trans.png)
[英]PostgreSQL - Multiple select primary key from three tables and insert as foreign key into one table
[英]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.