Postgresql 数据库重构到多对多关系
在一些需要引入未来多对多关系的数据库重构过程中,我偶然发现了一些我认为可能的事情 给定原始表格:Postgresql 数据库重构到多对多关系,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,在一些需要引入未来多对多关系的数据库重构过程中,我偶然发现了一些我认为可能的事情 给定原始表格: CREATE TABLE a ( id serial NOT NULL, field1 varchar, field2 varchar, field3 varchar ); 和一个新创建的表: CREATE TABLE b ( id serial NOT NULL, field1 varchar, field2 varchar ); 我想把字段1和字段2的内
CREATE TABLE a (
id serial NOT NULL,
field1 varchar,
field2 varchar,
field3 varchar
);
和一个新创建的表:
CREATE TABLE b (
id serial NOT NULL,
field1 varchar,
field2 varchar
);
我想把字段1和字段2的内容从a移到b。为了适应多对多关系,还提供了关联表:
CREATE TABLE a_b (
aid serial NOT NULL,
bid serial NOT NULL
);
在这里,原始a-id和新创建的b-id应该结束
因此,如果我从这样的a桌开始
| 33 | John | Jane | Juli |
| 34 | Fred | Carl | Josh |
| 1 | Juli |
| 2 | Josh |
我希望看到它最终出现在b表中:
| 1 | John | Jane
| 2 | Fred | Carl
以及协会a_b
| 33 | 1 |
| 34 | 2 |
原始表将删除field1和field2,因此我将如下所示
| 33 | John | Jane | Juli |
| 34 | Fred | Carl | Josh |
| 1 | Juli |
| 2 | Josh |
我立即想到了使用with查询,但没有找到让它工作的方法。
这显然不起作用:
WITH new AS (
INSERT INTO b (field1, field2)
SELECT field1, field2 FROM a
RETURNING id
)
INSERT INTO a_b (???, bid) SELECT * FROM new;
但这说明了问题所在。我找不到在保持与相应a-id的关系的同时插入b的方法。我想这一定是可能的
有什么想法吗
瑟伦
为了简洁,我省略了外键之类的东西。简洁不是你的朋友。当缺少某些东西时,我们无法判断你是否言简意赅,或者你是否犯了一个大错误
CREATE TABLE a (
id serial primary key,
field1 varchar,
field2 varchar,
field3 varchar
);
CREATE TABLE b (
id serial primary key,
field1 varchar,
field2 varchar
);
“关联”表存储外键;您应该存储“a”中的id号和“b”中的id号。所以应该这样宣布
CREATE TABLE a_b (
aid integer NOT NULL,
bid integer NOT NULL,
primary key (aid, bid),
foreign key (aid) references a (id),
foreign key (bid) references b (id)
);
让我们在“a”中添加几行。仔细看下面第二行和第三行的重复部分,“Fred”和“Carl”
要填充“b”,请插入a的不同(唯一)组合
insert into b (field1, field2)
select distinct field1, field2
from a;
select * from b;
现在您可以连接这三个表以查看完整的关联。基于这样的查询创建视图通常很有用
select b.id bid, b.field1, b.field2, a.id aid, a.field3
from a_b
inner join a on a.id = a_b.aid
inner join b on b.id = a_b.bid
order by a.id;
投标现场1现场2辅助现场3
--
1约翰·简1朱莉
3弗雷德·卡尔2乔希
3弗雷德·卡尔3艾比
2艺术卡尔4艾比
当您确信数据是正确的时,可以从a中删除列“field1”和“field2”
select b.id bid, b.field1, b.field2, a.id aid, a.field3
from a_b
inner join a on a.id = a_b.aid
inner join b on b.id = a_b.bid
order by a.id;
bid field1 field2 aid field3
--
1 John Jane 1 Juli
3 Fred Carl 2 Josh
3 Fred Carl 3 Abby
2 Art Carl 4 Abby