【发布时间】:2015-08-25 16:48:49
【问题描述】:
我正在征求您的意见以了解这是否可能,因为我是菜鸟,也许我正试图以完全错误的方式做到这一点。我进行了很多搜索,但一无所获,可能没有使用正确的搜索条件。
我正在使用 Postgresql 9.1。我已经简化了情况来理解方法
我有 3 张桌子:
- 表 A(主)
- 表 B(链接到表 A)
- 表 C(链接到表 B)
(查看架构)
表 A
id_A | data_A
-----+--------
A01 | dataA01
A02 | dataA02
表 B
id_B | ref_id_A | data_B
-----+----------+--------
B01 | A01 | dataB01
B02 | A01 | dataB02
B03 | A02 | dataB03
B04 | A02 | dataB04
B05 | A02 | dataB05
B06 | A02 | dataB06
表 C
id_C | ref_id_B | data_C
-----+----------+--------
C01 | B01 | dataC01
C02 | B01 | dataC02
C03 | B02 | dataC03
C04 | B02 | dataC04
我要做的是复制链接到表 A 的所有数据,并使用新 ID 保留存储在表 B 和 C 中的所有数据和引用。它应该像复制和粘贴一样工作,以便在开发新版本的同时维护旧版本
复制 A01 -> A03
表 A
id_A | data_A
-----+--------
A01 | dataA01
A02 | dataA02
A03 | dataA01
表 B
id_B | ref_id_A | data_B
-----+----------+--------
B01 | A01 | dataB01
B02 | A01 | dataB02
B03 | A02 | dataB03
B04 | A02 | dataB04
B05 | A02 | dataB05
B06 | A02 | dataB06
B07 | A03 | dataB01
B08 | A03 | dataB02
表 C
id_C | ref_id_B | data_C
-----+----------+--------
C01 | B01 | dataC01
C02 | B01 | dataC02
C03 | B02 | dataC03
C04 | B02 | dataC04
C05 | B07 | dataC01
C06 | B07 | dataC02
C07 | B08 | dataC03
C08 | B08 | dataC04
我编写了这个查询来复制 A01,它完美地保存了表 B 中的数据,但我无法复制表 C 中的数据
WITH new_id_A as
(insert into table_A (id_A, data_A) (select id_A, data_A from table_A where id_A='A01') returning id_A)
insert into table_B (ref_id_A, data_B) select (select id_A from new_id_A) as ref_id_A, data_B from table_B where ref_id_A='A01';
我尝试了不同的方法,但没有结果
我可以使用代码轻松完成任务,但我更愿意在单个事务中在数据库中完成它
感谢您的关注
【问题讨论】:
-
如何在表中生成 ID?理想情况下,这将按顺序完成。在这种情况下,插入数据的“副本”应该不难。
-
当
Table A发生更改时,您可以编写一个触发器以使用新ID 更新Table B。 -
@Bulat ID 是串行自动增量的,无法在不更改所有表的情况下更改表结构来存储字母数字 ID。但如果我要创建一个新数据库是个好主意
-
@Colin 我不太明白你关于触发器的建议。你是说我应该触发一个触发器,当我在表 A 中添加一个新行时它应该复制一条记录?哪个记录?如何指定哪个记录?也许我需要一个函数
-
使用我之前写的查询的方法,问题是我可以报告表B的新ID,但是表C中的数据与旧ID_B相关。所以我需要一个带有 old_id_1 -> new_id_1 的表来从表 C 中检索数据
标签: sql database postgresql postgresql-9.1