Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Sql 复制并记录一些具有相关性的表_Sql_Postgresql_Sql Insert - Fatal编程技术网

Sql 复制并记录一些具有相关性的表

Sql 复制并记录一些具有相关性的表,sql,postgresql,sql-insert,Sql,Postgresql,Sql Insert,如何在主表中复制具有不同值但具有相同依赖项的条目(例如a_id=1) 作为手册 CREATE TABLE a ( a_id SERIAL PRIMARY KEY, a_value varchar(255) ); CREATE TABLE b ( b_id SERIAL PRIMARY KEY, b_value varchar(255), a_id INT REFERENCES a(a_id) NOT NULL, UNIQUE (a_id, b_va

如何在主表中复制具有不同值但具有相同依赖项的条目(例如a_id=1)

作为手册

CREATE TABLE a (
    a_id SERIAL PRIMARY KEY,
    a_value varchar(255)
);
CREATE TABLE b (
    b_id SERIAL PRIMARY KEY,
    b_value varchar(255),
    a_id INT REFERENCES a(a_id) NOT NULL,
    UNIQUE (a_id, b_value)
);
CREATE TABLE c (
    c_id SERIAL PRIMARY KEY,
    c_value varchar(255),
    b_id INT REFERENCES b(b_id) NOT NULL,
    UNIQUE (b_id, c_value)
);

INSERT INTO a (a_value) VALUES ('a1'),('a2'),('a3');
INSERT INTO b (a_id, b_value) VALUES (1, 'b01'),(1, 'b02'),(2, 'b01'),(2, 'bbb'),(3, 'b3');
INSERT INTO c (b_id, c_value) VALUES (1, 'c1'),(1, 'c2'),(1, 'c3'),(2, 'c1'),(2, 'c2'),(2, 'c3'),(4, 'c2');

使用两个表可以完成以下工作:

INSERT INTO a (a_value) SELECT 'copy_' || a_value FROM a RETURNING a_id;
--give a_id = 4;
INSERT INTO b (a_id, b_value) SELECT 4, b_value FROM b WHERE b.a_id = 1 RETURNING b_id;
--give b_id = 6 and 7
INSERT INTO c (b_id, c_value) SELECT 6, c_value FROM c WHERE c.b_id = 1;
INSERT INTO c (b_id, c_value) SELECT 7, c_value FROM c WHERE c.b_id = 2;
但是如何复制表C中的记录呢?有四张桌子吗

以前

WITH
a_ AS (
INSERT INTO a (a_value) SELECT 'copy_'||(SELECT COUNT(a_id) FROM a WHERE a_value LIKE 'copy_%')||'_'||a_value FROM a WHERE a_id = 1 RETURNING a_id
)
INSERT INTO b (a_id, b_value) 
    SELECT a_.a_id, b_value FROM a_, b WHERE b.a_id = 1 RETURNING b_id
b

c

之后

a

b

c


我在表B中添加了一列

c_id| b_id| c_value
--------------
1  |  1  |  c1
2  |  1  |  c2
3  |  1  |  c3
4  |  2  |  c1
5  |  2  |  c2
6  |  2  |  c3
7  |  4  |  c2
8  |  6  |  c1
9  |  6  |  c2
10 |  6  |  c3
11 |  7  |  c1
12 |  7  |  c2
13 |  7  |  c3
并以

 old_b_id INT REFERENCES b(b_id)

这是工作

我在表B中添加了列

c_id| b_id| c_value
--------------
1  |  1  |  c1
2  |  1  |  c2
3  |  1  |  c3
4  |  2  |  c1
5  |  2  |  c2
6  |  2  |  c3
7  |  4  |  c2
8  |  6  |  c1
9  |  6  |  c2
10 |  6  |  c3
11 |  7  |  c1
12 |  7  |  c2
13 |  7  |  c3
并以

 old_b_id INT REFERENCES b(b_id)

这是工作

您是否尝试过使用a AS(插入a…,b AS(插入b…)插入c…。?在b中插入新的2行,例如a_id=1的2行:在c中插入6行,例如b_id在(1,2)中,因此结果如下:这是您期望的使用两个表进行选择的结果?是的,但我也希望复制表c中的记录,其中包含指向表b中新条目的链接您是否尝试过使用a AS(插入a…),b AS(插入b…)插入c…?在b中插入新的2行,例如a_id=1的2行:在c中插入6行,例如b_id在(1,2)中,因此这里的结果是:您对使用两个表进行选择的预期结果?是,但我也希望复制表C中的记录,其中包含指向表B中新条目的链接
b_id| a_id| b_value
--------------
1   |  1  |  b01
2   |  1  |  b02
3   |  2  |  b01
4   |  2  |  bbb
5   |  3  |  b3
6   |  4  |  b01
7   |  4  |  b02
c_id| b_id| c_value
--------------
1  |  1  |  c1
2  |  1  |  c2
3  |  1  |  c3
4  |  2  |  c1
5  |  2  |  c2
6  |  2  |  c3
7  |  4  |  c2
8  |  6  |  c1
9  |  6  |  c2
10 |  6  |  c3
11 |  7  |  c1
12 |  7  |  c2
13 |  7  |  c3
 old_b_id INT REFERENCES b(b_id)
WITH
a_ AS (
INSERT INTO a (a_value) SELECT 'copy_'||(SELECT COUNT(a_id) FROM a WHERE a_value LIKE 'copy_%')||'_'||a_value FROM a WHERE a_id = 3 RETURNING a_id
),
new_a AS(
SELECT b_id, a_.a_id FROM b, a_ WHERE b.a_id = 3
)
,b_ AS (
INSERT INTO b (a_id, b_value, old_b_id) SELECT new_a.a_id, b_value, new_a.b_id FROM new_a LEFT JOIN b USING(b_id) RETURNING b_id, old_b_id
)
INSERT INTO c (b_id, c_value) SELECT b_.b_id, c_value FROM c INNER JOIN b_ ON (c.b_id = b_.old_b_id)