Функция plpgsql, которые находит все уникальные идентификаторы id из таблицы change_request_id, далее с циклом по таблице change_date ищет записи по change_request_id, копирует строки из change_data, создает их копию и связывает новые и старые строки между собой
CREATE OR REPLACE FUNCTION copy_change_data() RETURNS void LANGUAGE plpgsql AS $function$ DECLARE id_change_request_id integer; change_data_id_existing integer; change_data_id_new integer; BEGIN FOR id_change_request_id IN SELECT DISTINCT change_request_id FROM change_request_id LOOP FOR change_data_id_existing IN SELECT id FROM change_data WHERE change_request_id = id_change_request_id LOOP INSERT INTO change_data (name, change_request_id) VALUES ( (SELECT name FROM change_data WHERE id = change_data_id_existing), (SELECT change_request_id FROM change_data WHERE id = change_data_id_existing)); SELECT currval('change_data_id_seq'); change_data_id_new := currval('change_data_id_seq');