sql - 表记录的深拷贝 - 复制一条记录和所有相关数据

标签 sql postgresql

“深度复制”表中单个记录的有效方法是什么。通过“深拷贝”,我的意思是创建一个新记录,它是原始记录的副本(除了新的主键),然后还为每个其他表中的每个数据点创建一个新的重复记录,与原始记录(除了这些现在将引用这个新副本)。

例如,如果有一个包含公司、部门和员工的表,每个公司都有多个部门,员工可能在一个或多个部门工作——我该如何创建一个新公司另一家公司的精确复制品,包括相同的部门和相同的员工(除了不同的主键)?

最佳答案

在不知道你的表结构的情况下,我只能做一些假设。我会以这种方式处理它(见下文)。注意内嵌注释。

CREATE OR REPLACE FUNCTION fn_copy_company(source_company_id INT)
RETURNS INT AS $$

    DECLARE new_company_id INT;

BEGIN

    -- Copy the company data
    INSERT INTO companies (name)
    SELECT name FROM companies WHERE id = source_company_id
    RETURNING id INTO new_company_id;

    -- Copy the departments and return the newly created record(s) as a CTE
    WITH new_departments AS
    (
        INSERT INTO departments (company_id, name)
        SELECT new_company_id, name FROM departments WHERE company_id = source_company_id
        RETURNING *
    )

    -- Copy all employees belonging to the department(s) with new department ids
    INSERT INTO employees (department_id, name)
    SELECT
        ndpt.department_id,
        emp.name
    FROM
        new_departments ndpt
    INNER JOIN
        departments sdpt
        ON  (ndpt.company_id = sdpt.company_id)
        AND (ndpt.name = sdpt.name)
    INNER JOIN
        employees emp
        ON  (sdpt.department_id = emp.department_id);

    -- Returns the new company id
    RETURN new_company_id;

END; $$ LANGUAGE PLPGSQL VOLATILE;

注意:这假设您为每个具有序列的表都有一个 id 字段。

关于sql - 表记录的深拷贝 - 复制一条记录和所有相关数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45149780/

相关文章:

sql - Postgresql 求直线斜率并强制通过原点的方法

sql - 将多行转换为多列的一行

sql - 如何使用 jOOQ 使用命名参数而不是问号

mysql - 'connect by' 或 'WITH RECURSIVE' 是否可以在高度连接的大数据场景中使用?

sql - 如何在 SQL 查询中添加条件语句?

node.js - Postgres 和 Sequelize - 无法读取未定义的属性 'name'

bash - 用于更改 postgresql 用户密码的 bash 脚本

mysql - docker 拒绝 postgres 和 mysql 挂载

sql - 在 MongoDB 中使用 $and 的多个 $regex

mysql - SQL 约束,检查是否仅存在一条记录并将其值用于表