Estou convertendo um db do postgres para mysql.
Como não consigo encontrar uma ferramenta que faça o truque, vou converter todas as seqüências do postgres em IDs de autoincremento no mysql com o valor de autoincrement.
Então, como posso listar todas as seqüências em um banco de dados do Postgres ( versão 8.1 ) com informações sobre a tabela em que ele é usado, o próximo valor etc com uma consulta SQL?
Esteja ciente de que não posso usar a information_schema.sequences
exibição na versão 8.4.
Respostas:
A consulta a seguir fornece nomes de todas as seqüências.
Normalmente, uma sequência é nomeada como
${table}_id_seq
. A correspondência simples de padrão de regex fornecerá o nome da tabela.Para obter o último valor de uma sequência, use a seguinte consulta:
fonte
${table}_id_seq
dica foi útil${table}_${column}_seq
para seqüências criadas automaticamenteObserve que, a partir do PostgreSQL 8.4, você pode obter todas as informações sobre sequências usadas no banco de dados via:
Como estou usando uma versão mais alta do PostgreSQL (9.1) e estava procurando a mesma resposta, alta e baixa, adicionei essa resposta para bem da posteridade e para futuros pesquisadores.
fonte
Executar:
psql -E
e depois\ds
fonte
depois de um pouco de dor, eu entendi.
a melhor maneira de conseguir isso é listar todas as tabelas
e, em seguida, para cada tabela, liste todas as colunas com atributos
em seguida, para cada coluna, teste se há uma sequência
e, em seguida, obtenha as informações sobre essa sequência
fonte
informações da sequência: valor máximo
SELECT * FROM information_schema.sequences;
informação da sequência: último valor
SELECT * FROM <sequence_name>
fonte
O relacionamento entre sequências geradas automaticamente (como aquelas criadas para colunas SERIAL) e a tabela pai é modelado pelo atributo do proprietário da sequência.
Você pode modificar esse relacionamento usando a cláusula OWNED BY do comando ALTER SEQUENCE
por exemplo, ALTER SEQUENCE foo_id POSSUÍDO por foo_schema.foo_table
para configurá-lo para ser vinculado à tabela foo_table
ou ALTER SEQUENCE foo_id POSSUÍDO por NENHUM
para quebrar a conexão entre a sequência e qualquer tabela
As informações sobre esse relacionamento são armazenadas na tabela de catálogo pg_depend .
o relacionamento de junção é o link entre pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - que vincula a sequência ao registro de junção e, em seguida, pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r', que vincula o registro de associação à relação de propriedade (tabela)
Essa consulta retorna todas as sequências -> dependências da tabela em um banco de dados. A cláusula where o filtra para incluir apenas relacionamentos gerados automaticamente, o que o restringe a exibir apenas sequências criadas por colunas digitadas SERIAL.
fonte
Sei que este post é bastante antigo, mas achei a solução do CMS muito útil, pois estava procurando uma maneira automatizada de vincular uma sequência à tabela AND coluna e queria compartilhar. O uso da tabela de catálogo pg_depend foi a chave. Expandi o que foi feito para:
Esta versão adiciona coluna à lista de campos retornados. Com o nome da tabela e o nome da coluna em mãos, uma chamada para pg_set_serial_sequence facilita a garantia de que todas as seqüências no banco de dados estejam definidas corretamente. Por exemplo:
Espero que isso ajude alguém a redefinir sequências!
fonte
Esta instrução lista a tabela e a coluna que estão associadas a cada sequência:
Código:
mais veja aqui link para responder
fonte
Melhoria da resposta anterior:
fonte
Parcialmente testado, mas parece quase completo.
Crédito onde o crédito é devido ... é parcialmente modificado com a engenharia reversa do SQL registrado a partir de \ d em uma tabela conhecida que tinha uma sequência. Tenho certeza de que também poderia ser mais limpo, mas ei, desempenho não era uma preocupação.
fonte
Como um hack, mas tente o seguinte:
Remova o último UNION e execute o resultado
fonte
Obtenha sequências para cada coluna de cada tabela através da análise da cláusula DEFAULT. Este método fornece informações sobre a quais sequências de colunas estão vinculadas e não usa dependências que podem não existir para algumas sequências.
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
Função uniforme encontrada nem todas sequências para mim!Solução:
Observe que 1 sequência pode ser usada em várias tabelas, portanto, pode ser listada em várias linhas aqui.
fonte
Obrigado pela ajuda.
Aqui está a função pl / pgsql que atualiza cada sequência de um banco de dados.
fonte
Aqui está outro que tem o nome do esquema ao lado do nome da sequência
fonte
Esta função mostra o last_value de cada sequência.
Ele gera uma tabela de 2 colunas que diz o nome da sequência mais o seu último valor gerado.
fonte
Assumindo a
exec()
função declarada neste post https://stackoverflow.com/a/46721603/653539 , sequências juntamente com seus últimos valores podem ser buscadas usando uma única consulta:fonte
fonte
Aqui está um exemplo de como usar
psql
para obter uma lista de todas as seqüências comlast_value
:psql -U <username> -d <database> -t -c "SELECT 'SELECT ''' || c.relname || ''' as sequence_name, last_value FROM ' || c.relname || ';' FROM pg_class c WHERE (c.relkind = 'S')" | psql -U <username> -d <database> -t
fonte