gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:48:06 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com