在表格中“深度复制”单个记录的有效方法是什么。通过“深度复制”,我的意思是创建一个原始副本的新记录(除了使用新的主键),然后为每个其他表中的每个数据点创建一个新的重复记录,该记录与原始记录(除了这些记录现在引用这个新副本)。
例如,如果有一个公司,部门和员工的表格,对于每个公司,有多个部门,员工可能在一个或多个部门工作 - 我怎样才能创建一个新的公司另一家公司的完全复制品,包括相同的部门和相同的员工(除了主键不同)?
答案 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字段。