DB를 postgres에서 mysql로 변환하고 있습니다.
트릭 자체를 수행하는 도구를 찾을 수 없으므로 모든 postgres 시퀀스를 자동 증가 값을 사용하여 mysql의 자동 증가 ID로 변환합니다.
그렇다면 Postgres DB ( 8.1 버전)의 모든 시퀀스를 사용하는 테이블에 대한 정보, 다음 값 등을 SQL 쿼리와 함께 어떻게 나열 할 수 있습니까?
information_schema.sequences
8.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$;
이것이 시퀀스를 재설정하는 데 도움이되기를 바랍니다!