假设我有一个名为 的表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) 想象一下具有 1:M 关系的多个父子表。我想“级联” - 根据根父表行选择插入重复行。每个表都有IDENTITY
主键,每个子表都有其父 ID 的 FK(上一级)。
给定根父表 ID,为其及其所有子表插入重复行。
我尝试了“级联”插入 CTE,但遇到了RETURNING
仅限返回插入数据的问题,而我需要额外的信息来连接下一个INSERT
.
我通过添加额外的列 ( ) 来完成此任务copied_from_id
。
有没有办法在没有额外列的情况下完成相同的任务?
我确实看到了@Erwin Brandstetter 的这个答案,但他的例子只有 1 个父母和孩子,我不知道如何将其扩展到多个级别
这是示例 DDL 和 DML 来说明问题
--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)