更多

PostgreSQL更新所有表序列值到当前表中最大值

最近一个项目更换了数据库,从原有数据库中导入了一些数据,然而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();

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code