由于更换了数据库,从原有数据库中导入了一些数据,然而PostgreSql新数据库中的主键序列仍然为1,若直接插入新数据会产生报错,一个个设置每个表的主键序列值到最大太麻烦了,研究了一下使用了游标来实现自动完成所有表的序列更新。在我的数据库中,每张表都以“id”作为主键,所有的序列都是以“表名_id_seq”命名,且有一张以“_”开头的表不需要更新序列。请根据你自己的实际情况更改以下代码。此代码会创建一个update_tables_seq函数,若使用之后不再需要可以删除。
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;
执行完以上代码后,再执行以下代码调用即可:
SELECT update_tables_seq();