Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 数据库重构到多对多关系_Postgresql_Postgresql 9.3 - Fatal编程技术网

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