2016-12-12 4 views
1

(PostgreSQL 9.4)PostgreSQL에서 데이터베이스 마이그레이션을하기 전에 모든 시퀀스를 1로 재설정하는 방법은 무엇입니까?

이전 데이터베이스를 새 스키마로 마이그레이션하는 중입니다. pg_restore를 사용하여 내 개발 컴퓨터에서 새 스키마 (데이터 없음)를 얻은 후 일부 시퀀스가 ​​1에서 시작하지 않는다는 것을 알았습니다. (더 높은 값으로 작업하기 위해 개발 중에 여러 시퀀스를 변경했습니다). 나는 데이터베이스 마이그레이션을 시작하기 전에

다시 1-모든 시퀀스를 (일부는 없습니다 기본 키입니다) 리셋의 프로그램 방법은 무엇입니까?

도움이나 제안을 해주셔서 감사합니다.

+0

"모든 시퀀스를 재설정하는 프로그래밍 방식"이란 무엇입니까? 'ALTER SEQUENCE table_name_id_seq START WITH 1; '을 사용할 수 있습니다. –

+0

@ M.Wiśnicki True ... 한 번에 한 테이블 씩. 그러나 나는 데이터베이스에서 모든 시퀀스를 리셋하는 psql 스크립트가 필요합니다. 어떤 테이블과도 독립적입니다. (나는 약 150 개의 시퀀스가있는 수백 개의 테이블을 가지고있다). 감사. –

답변

2

당신은 DATA_BASE_NAME

DO $$ 
DECLARE 
i TEXT; 
BEGIN 
FOR i IN (SELECT tb.table_name FROM information_schema.tables AS tb INNER JOIN information_schema.columns AS cols ON 
     tb.table_name = cols.table_name WHERE tb.table_catalog='DATA_BASE_NAME' 
     AND tb.table_schema='public' AND cols.column_name='Id') LOOP 
     EXECUTE 'SELECT setval('||'"' || i || '_Id_seq"'||',1);'; 

    END LOOP; 
END $$; 
+0

감사합니다. 나는 단지 information_schema를 사용하려고 생각하고 있었다. –

2

이 내가 대중 스키마의 모든 사람들에게 시퀀스를 제한 할 내 요구, PgAdmin에서 SETVAL manual.만큼 간단한 일이 :

SELECT SETVAL(c.oid, 1) 
from pg_class c JOIN pg_namespace n 
on n.oid = c.relnamespace 
where c.relkind = 'S' and n.nspname = 'public' 

나는 사람이 여기에 오는에 도움으로이를 게시 할 수 있습니다.

0

의 열 Id 아 파크 - 모든 테이블을 얻을 여기, setval 루프에서 사용 서열 값을 변경할 수 있습니다 당신은이 SQL 코드와 함께 할 수 있습니다 : 나는 정보를 읽을

DO $$ 
DECLARE 
i TEXT; 
BEGIN 
FOR i IN (SELECT column_default FROM information_schema.columns WHERE column_default SIMILAR TO 'nextval%') 
    LOOP 
     EXECUTE 'ALTER SEQUENCE'||' ' || substring(substring(i from '''[a-z_]*')from '[a-z_]+') || ' '||' RESTART 1;';  
    END LOOP; 
END $$; 

그리고 열의 이름을 분리하기 위해 정규식을 사용합니다. 내가 쿼리를 만들고 각 시퀀스에 대해 EXECUTE를 사용한 후에. 이 코드는 DB의 모든 시퀀스를 나타냅니다.