sql - 递归复制条目

标签 sql postgresql duplicates common-table-expression recursive-query

我正在尝试复制一个条目。那部分并不难。棘手的部分是:n 条目与外键相连。对于这些条目中的每一个,都有 n 条目与之相关联。我使用查找来手动复制和交叉引用外键。
是否有一些子程序或方法来复制条目并搜索和复制外国条目?也许我还没有偶然发现这种类型的复制的名称,这种类型的操作是否有特定的数据库相关标题?

PostgreSQL 8.4.13

main 入口(uid 是连续的)

 uid | title   
-----+-------
   1 | stuff

department(departmentid是序列号,uidref是上面uid的外键)

 departmentid | uidref | title         
--------------+--------+-------
          100 |      1 | Foo
          101 |      1 | Bar
部门的

sub_category(上面的departmentid是textid是serial,departmentref是foreign)

textid | departmentref | title          
-------+---------------+----------------
  1000 |           100 | Text for Foo 1 
  1001 |           100 | Text for Foo 2 
  1002 |           101 | Text for Bar 1 

最佳答案

您可以使用 data-modifying CTEs 在一条语句中完成所有操作(需要 Postgres 9.1 或更高版本)。
您的主键是 serial列使它更容易:

WITH m AS (
   INSERT INTO main (<all columns except pk>)
   SELECT <all columns except pk>
   FROM   main
   WHERE  uid = 1
   RETURNING uid AS uidref                  -- returns new uid
   )
, d AS (
   INSERT INTO department (<all columns except pk>)
   SELECT <all columns except pk>
   FROM   m
   JOIN   department d USING (uidref)
   RETURNING departmentid AS departmentref  -- returns new departmentids
   )
INSERT INTO sub_category (<all columns except pk>)
SELECT <all columns except pk>
FROM   d
JOIN   sub_category s USING (departmentref);

替换<all columns except pk>与您的实际专栏。 pk用于 primary key , 比如 main.uid .

查询不返回任何内容。您可以返回几乎任何东西。您只是没有指定任何内容。

您不会称其为“复制”。该术语通常用于保持多个数据库实例或对象同步。您只是在复制一个条目 - 并递归地依赖对象。

除了命名约定:
使用命名约定会变得更加简单,即用相同(描述性)名称标记所有列表示“表foo的ID”,例如foo_id .还有其他命名约定,但这是编写查询的最佳方式,IMO。

关于sql - 递归复制条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023839/

相关文章:

python - 加入sqlalchemy后如何解决歧义列

java - Postgres 查询 - 使用文本类型更新 json 列中的字段

R 无法通过 rPostgreSQL 将表写入 PostgreSQL

sql - 消除具有反转值的列的行

sql - MySQL: key 2 的重复条目

mySql 数据库 - ID auto_increment : what are the risks of it?

mysql - 是否可以优化此 mysql 查询?

java - 来自网络调用的房间数据库中的非重复条目

java - 在不改变元素顺序的情况下删除数组中的重复项

sql - 从没有主键的 SQL 表中删除重复记录