相关疑难解决方法(0)

PostgreSQL中具有主键的重复行

假设我有一个名为 的表people,其中id是主键:

+-----------+---------+---------+
|  id       |  fname  |  lname  |
| (integer) | (text)  | (text)  |
+===========+=========+=========+
|  1        | Daniel  | Edwards |
|  2        | Fred    | Holt    |
|  3        | Henry   | Smith   |
+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个行重复查询,该查询足够健壮,可以解释表的架构更改。每当我向表中添加一列时,我都不想回去修改重复查询。

我知道我可以做到这一点,这将复制记录 ID 2 并为复制的记录提供一个新 ID:

INSERT INTO people (fname, lname) SELECT fname, lname FROM people WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加一age列,则需要修改查询以同时考虑年龄列。

显然我不能执行以下操作,因为它还会复制主键,从而导致duplicate key value violates unique constraint-- 而且,无论如何我都不希望它们共享相同的 ID:

INSERT INTO people …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql default-value postgresql-9.4

8
推荐指数
1
解决办法
2万
查看次数

为多个级联 1:M 子表插入重复行

想象一下具有 1:M 关系的多个父子表。我想“级联” - 根据根父表行选择插入重复行。每个表都有IDENTITY主键,每个子表都有其父 ID 的 FK(上一级)。

目标

给定根父表 ID,为其及其所有子表插入重复行。

我尝试了“级联”插入 CTE,但遇到了RETURNING仅限返回插入数据的问题,而我需要额外的信息来连接下一个INSERT.

我通过添加额外的列 ( ) 来完成此任务copied_from_id

我的问题

有没有办法在没有额外列的情况下完成相同的任务?

我确实看到了@Erwin Brandstetter 的这个答案,但他的例子只有 1 个父母和孩子,我不知道如何将其扩展到多个级别

例子

这是示例 DDL 和 DML 来说明问题

  • lvl_one - 最顶层、根、父表
  • lvl_two - lvl_one 的子表 (1:M)
  • lvl_三 - lvl_two 的子表 (1:M)

设置

--DROP TABLE IF EXISTS lvl_one,lvl_two,lvl_three CASCADE;
CREATE TABLE IF NOT EXISTS public.lvl_one (
    id      bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
    name    text,
    CONSTRAINT lvl_one_pk …
Run Code Online (Sandbox Code Playgroud)

postgresql insert cte

5
推荐指数
1
解决办法
1206
查看次数