表记录的深层副本 - 复制记录和所有相关数据

时间:2017-07-17 16:58:10

标签: sql postgresql

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

例如,如果有一个公司,部门和员工的表格,对于每个公司,有多个部门,员工可能在一个或多个部门工作 - 我怎样才能创建一个新的公司另一家公司的完全复制品,包括相同的部门和相同的员工(除了主键不同)?

1 个答案:

答案 0 :(得分:0)

在不知道表格结构的情况下,我只能做出一些假设。我会这样接近它(见下文)。请注意内联注释。

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字段。