我正在尝试复制一个条目。那部分并不难。棘手的部分是: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/