begin; -- handle NULL chart_id's insert into chart (accno, description, charttype) values ('1000000000', 'Broken SQL-Ledger Data', 'L'); --handle duplicate transaction id's. CREATE TEMPORARY TABLE id_agregator (id INT, table_name text); insert into id_agregator (id, table_name) SELECT id, 'ar' from ar; insert into id_agregator (id, table_name) SELECT id, 'ap' from ap; insert into id_agregator (id, table_name) SELECT id, 'business' from business; insert into id_agregator (id, table_name) SELECT id, 'chart' from chart; insert into id_agregator (id, table_name) SELECT id, 'customer' from customer; insert into id_agregator (id, table_name) SELECT id, 'department' from department; insert into id_agregator (id, table_name) SELECT id, 'employee' from employee; insert into id_agregator (id, table_name) SELECT id, 'gl' from gl; insert into id_agregator (id, table_name) SELECT id, 'oe' from oe; insert into id_agregator (id, table_name) SELECT id, 'parts' from parts; insert into id_agregator (id, table_name) SELECT id, 'partsgroup' from partsgroup; insert into id_agregator (id, table_name) SELECT id, 'project' from project; insert into id_agregator (id, table_name) SELECT id, 'vendor' from vendor; insert into id_agregator (id, table_name) SELECT id, 'warehouse' from warehouse; CREATE TEMPORARY VIEW id_view1 AS SELECT id, count(*) AS num_rows FROM id_agregator GROUP BY id HAVING count(*) > 1; select setval('id', (select max(id) + 1 from id_agregator)); create function fix_dupes() RETURNS opaque AS ' DECLARE dupe_id id_agregator%ROWTYPE; BEGIN FOR dupe_id IN SELECT id FROM id_agregator WHERE id IN (SELECT id FROM id_view1) LOOP EXECUTE ''UPDATE '' || dupe_id.table_name || '' SET id = nextval(''''id'''') WHERE id = '' ||dupe_id.id; UPDATE acc_trans SET trans_id = currval(''id'') WHERE id = ||dupe_id.id; INSERT INTO acc_trans (trans_id, amount, chart_id) VALUES ( currval(''id''), ''1'', ( SELECT id FROM chart WHERE accno = ''1000000000'' ) ); INSERT INTO acc_trans (trans_id, amount, chart_id) VALUES ( currval(''id''), ''-1'', ( SELECT id FROM chart WHERE accno = ''1000000000'' ) ); END LOOP; RETURN NULL; END; ' LANGUAGE PLPGSQL; SELECT fix_dupes (); drop function fix_dupes(); commit;