最近一个项目更换了数据库,从原有数据库中导入了一些数据,然而PostgreSql新数据库中的主键序列仍然为1,若直接插入新数据会产生报错,一个个设置每个表的主键序列值到最大太麻烦了,研究了一下使用了游标来实现自动完成所有表的序列更新。在我的数据库中,每张表都以“id”作为主键,所有的序列都是以“表名_id_seq”命名,且有一张以“_”开头的表不需要更新序列。请根据你自己的实际情况更改以下代码。此代码会创建一个update_tables_seq函数,若使用之后不再需要可以删除。
PLSQL
CREATE OR REPLACE FUNCTION update_tables_seq ( )
RETURNS void AS $$
DECLARE
table_name_cursor CURSOR FOR
SELECT
tablename
FROM
pg_tables
WHERE
schemaname = 'public'
AND tablename NOT LIKE'\_%';
table_name_ VARCHAR(255);
prepared_sql VARCHAR(255);
BEGIN
FOR ref_record in table_name_cursor LOOP
prepared_sql := 'SELECT setval( ''' || ref_record.tablename;
prepared_sql := prepared_sql || '_id_seq'','||'( SELECT MAX ( id ) FROM "'||ref_record.tablename||'") );';
RAISE NOTICE '%', prepared_sql;
EXECUTE prepared_sql;
END LOOP;
END;
$$ LANGUAGE plpgsql;
执行完以上代码后,再执行以下代码调用即可:
PLSQL
SELECT update_tables_seq();