[sql] SQL을 사용하여 Postgres db 8.1의 모든 시퀀스 나열

DB를 postgres에서 mysql로 ​​변환하고 있습니다.

트릭 자체를 수행하는 도구를 찾을 수 없으므로 모든 postgres 시퀀스를 자동 증가 값을 사용하여 mysql의 자동 증가 ID로 변환합니다.

그렇다면 Postgres DB ( 8.1 버전)의 모든 시퀀스를 사용하는 테이블에 대한 정보, 다음 값 등을 SQL 쿼리와 함께 어떻게 나열 할 수 있습니까?

information_schema.sequences8.4 릴리스 에서는 보기를 사용할 수 없습니다 .



답변

다음 쿼리는 모든 시퀀스의 이름을 제공합니다.

SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';

일반적으로 시퀀스의 이름은 ${table}_id_seq입니다. 간단한 정규식 패턴 일치는 테이블 이름을 제공합니다.

시퀀스의 마지막 값을 얻으려면 다음 쿼리를 사용하십시오.

SELECT last_value FROM test_id_seq;


답변

PostgreSQL 8.4부터는 다음을 통해 데이터베이스에서 사용되는 시퀀스에 대한 모든 정보를 얻을 수 있습니다 .

SELECT * FROM information_schema.sequences;

나는 더 높은 버전의 PostgreSQL (9.1)을 사용하고 있으며 동일한 답변을 높고 낮게 검색했기 때문에 후손을 위해 그리고 미래의 검색자를 위해이 답변을 추가했습니다.


답변

: 실행 psql -E다음과\ds


답변

약간의 고통 후, 나는 그것을 얻었다.

이를 달성하는 가장 좋은 방법은 모든 테이블을 나열하는 것입니다

select * from pg_tables where schemaname = '<schema_name>'

그런 다음 각 테이블에 대해 속성이있는 모든 열을 나열하십시오.

select * from information_schema.columns where table_name = '<table_name>'

그런 다음 각 열에 대해 시퀀스가 ​​있는지 테스트하십시오.

select pg_get_serial_sequence('<table_name>', '<column_name>')

그런 다음이 시퀀스에 대한 정보를 얻습니다.

select * from <sequence_name>


답변

시퀀스 정보 : 최대 값

SELECT * FROM information_schema.sequences;

시퀀스 정보 : 마지막 값

SELECT * FROM <sequence_name>


답변

자동으로 생성 된 시퀀스 (예 : SERIAL 컬럼에 대해 작성된 시퀀스)와 상위 테이블 간의 관계는 시퀀스 소유자 속성으로 모델링됩니다.

ALTER SEQUENCE 명령 의 OWNED BY 절을 사용하여이 관계를 수정할 수 있습니다.

예 : ALTER SEQUENCE foo_id foo_schema.foo_table이 소유 함

foo_table 테이블에 연결되도록 설정

또는 NONE이 소유 한 ALTER SEQUENCE foo_id

시퀀스와 테이블 간의 연결을 끊기

이 관계에 대한 정보는 pg_depend 카탈로그 테이블에 저장됩니다 .

결합 관계는 pg_depend.objid-> pg_class.oid WHERE relkind = ‘S’-링크를 시퀀스와 결합 레코드에 연결 한 다음 pg_depend.refobjid-> pg_class.oid WHERE relkind = ‘r’사이의 링크입니다. 소유 관계에 레코드 조인 (테이블)

이 쿼리는 데이터베이스의 모든 시퀀스-> 테이블 종속성을 반환합니다. where 절은 자동 생성 관계 만 포함하도록 필터링하여 SERIAL 유형 열에 의해 생성 된 시퀀스 만 표시하도록 제한합니다.

WITH fq_objects AS (SELECT c.oid,n.nspname || '.' ||c.relname AS fqname ,
                           c.relkind, c.relname AS relation
                    FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ),

     sequences AS (SELECT oid,fqname FROM fq_objects WHERE relkind = 'S'),
     tables    AS (SELECT oid, fqname FROM fq_objects WHERE relkind = 'r' )
SELECT
       s.fqname AS sequence,
       '->' as depends,
       t.fqname AS table
FROM
     pg_depend d JOIN sequences s ON s.oid = d.objid
                 JOIN tables t ON t.oid = d.refobjid
WHERE
     d.deptype = 'a' ;


답변

이 게시물이 꽤 오래 되었다는 것을 알고 있지만 CMS 의 솔루션 이 시퀀스를 테이블 및 열에 자동으로 연결하는 방법을 찾고 공유하고 싶을 때 매우 유용하다는 것을 알았습니다. 의 사용 pg_depend의 카탈로그 테이블은 키이었다. 나는 무엇을했는지 확장했다 :

WITH fq_objects AS (SELECT c.oid,n.nspname || '.' ||c.relname AS fqname ,
                           c.relkind, c.relname AS relation
                    FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace ),

     sequences AS (SELECT oid,fqname FROM fq_objects WHERE relkind = 'S'),
     tables    AS (SELECT oid, fqname FROM fq_objects WHERE relkind = 'r' )
SELECT
       s.fqname AS sequence,
       '->' as depends,
       t.fqname AS table,
       a.attname AS column
FROM
     pg_depend d JOIN sequences s ON s.oid = d.objid
                 JOIN tables t ON t.oid = d.refobjid
                 JOIN pg_attribute a ON a.attrelid = d.refobjid and a.attnum = d.refobjsubid
WHERE
     d.deptype = 'a' ;

이 버전은 반환 된 필드 목록에 열을 추가합니다. 테이블 이름과 열 이름을 모두 사용하면 pg_set_serial_sequence 를 호출 하면 데이터베이스의 모든 시퀀스가 ​​올바르게 설정되었는지 쉽게 확인할 수 있습니다. 예를 들면 다음과 같습니다.

CREATE OR REPLACE FUNCTION public.reset_sequence(tablename text, columnname text)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
    _sql VARCHAR := '';
BEGIN
    _sql := $$SELECT setval( pg_get_serial_sequence('$$ || tablename || $$', '$$ || columnname || $$'), (SELECT COALESCE(MAX($$ || columnname || $$),1) FROM $$ || tablename || $$), true)$$;
    EXECUTE _sql;
END;
$function$;

이것이 시퀀스를 재설정하는 데 도움이되기를 바랍니다!