不知道你的表的結構,我只能做一些假設。我會以這種方式處理它(見下文)。請注意內聯評論。
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字段具有序列表的每一個。
是否有外鍵使用?如果是這樣,您可能需要做更多的工作,因爲您沒有複製相同的主鍵。 – Nicarus
將使用外鍵,例如,如果我們複製一個公司,我們將創建新的,重複的部門,這些部門都會引用這個新公司 - 以此類推僱員。 – gilmatic
這是爲了一次性練習,還是在每次插入/更新後都希望發生這種情況? – Nicarus