Je convertis une base de données de postgres en mysql.
Comme je ne trouve pas d'outil qui fasse le truc lui-même, je vais convertir toutes les séquences postgres en identifiants d'auto-incrémentation dans mysql avec une valeur d'auto-incrémentation.
Alors, comment puis-je lister toutes les séquences dans une base de données Postgres ( version 8.1 ) avec des informations sur la table dans laquelle elle est utilisée, la valeur suivante, etc. avec une requête SQL?
Sachez que je ne peux pas utiliser la information_schema.sequences
vue dans la version 8.4.
Réponses:
La requête suivante donne les noms de toutes les séquences.
En général, une séquence est nommée
${table}_id_seq
. Une simple correspondance de motif regex vous donnera le nom de la table.Pour obtenir la dernière valeur d'une séquence, utilisez la requête suivante:
la source
${table}_id_seq
indice était utile${table}_${column}_seq
pour les séquences créées automatiquementNotez qu'à partir de PostgreSQL 8.4, vous pouvez obtenir toutes les informations sur les séquences utilisées dans la base de données via:
Puisque j'utilise une version supérieure de PostgreSQL (9.1) et que je cherchais la même réponse haut et bas, j'ai ajouté cette réponse pour la postérité et pour les futurs chercheurs.
la source
Exécuter:,
psql -E
puis\ds
la source
après un peu de douleur, je l'ai eu.
la meilleure façon d'y parvenir est de lister toutes les tables
puis, pour chaque table, listez toutes les colonnes avec des attributs
puis, pour chaque colonne, testez si elle a une séquence
puis, obtenez les informations sur cette séquence
la source
info de séquence: valeur maximale
SELECT * FROM information_schema.sequences;
info séquence: dernière valeur
SELECT * FROM <sequence_name>
la source
La relation entre les séquences générées automatiquement (telles que celles créées pour les colonnes SERIAL) et la table parent est modélisée par l'attribut de propriétaire de séquence.
Vous pouvez modifier cette relation à l'aide de la clause OWNED BY du ALTER SEQUENCE
par exemple, ALTER SEQUENCE foo_id OWNED par foo_schema.foo_table
pour le définir comme lié à la table foo_table
ou ALTER SEQUENCE foo_id OWNED by NONE
pour rompre la connexion entre la séquence et n'importe quelle table
Les informations sur cette relation sont stockées dans la table de catalogue pg_depend .
la relation de jointure est le lien entre pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - qui relie la séquence à l'enregistrement de jointure, puis pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r', qui relie le joindre l'enregistrement à la relation propriétaire (table)
Cette requête renvoie toutes les dépendances séquence -> table dans une base de données. La clause where le filtre pour n'inclure que les relations générées automatiquement, ce qui le restreint à n'afficher que les séquences créées par les colonnes de type SERIAL.
la source
Je sais que cet article est assez ancien, mais j'ai trouvé la solution de CMS très utile car je cherchais un moyen automatisé de lier une séquence à la table ET à la colonne, et je voulais partager. L'utilisation de la table de catalogue pg_depend était la clé. J'ai développé ce qui a été fait pour:
Cette version ajoute une colonne à la liste des champs renvoyés. Avec le nom de la table et le nom de la colonne en main, un appel à pg_set_serial_sequence permet de s'assurer facilement que toutes les séquences de la base de données sont correctement définies. Par exemple:
J'espère que cela aide quelqu'un à réinitialiser les séquences!
la source
Cette instruction répertorie la table et la colonne associées à chaque séquence:
Code:
plus voir ici lien pour répondre
la source
Amélioration de la réponse précédente:
la source
Partiellement testé mais semble presque complet.
Crédit là où le crédit est dû ... il est en partie rétro-ingénierie à partir du SQL enregistré à partir d'un \ d sur une table connue qui avait une séquence. Je suis sûr que cela pourrait aussi être plus propre, mais bon, les performances n'étaient pas un problème.
la source
Une sorte de hack, mais essayez ceci:
Supprimer la dernière UNION et exécuter le résultat
la source
Obtenez des séquences pour chaque colonne de chaque table via l'analyse de la clause DEFAULT. Cette méthode fournit des informations sur les séquences de colonnes liées et n'utilise pas de dépendances qui peuvent ne pas exister pour certaines séquences. Même la
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
fonction ne trouve pas toutes les séquences pour moi!Solution:
Notez qu'une séquence peut être utilisée dans plusieurs tables, elle peut donc être répertoriée sur plusieurs lignes ici.
la source
Merci de votre aide.
Voici la fonction pl / pgsql qui met à jour chaque séquence d'une base de données.
la source
En voici un autre qui a le nom du schéma à côté du nom de la séquence
la source
Cette fonction affiche la dernière_valeur de chaque séquence.
Il génère un tableau à 2 colonnes qui indique le nom de la séquence plus sa dernière valeur générée.
la source
En supposant que la
exec()
fonction déclarée dans cet article https://stackoverflow.com/a/46721603/653539 , les séquences avec leurs dernières valeurs peuvent être récupérées à l'aide d'une seule requête:la source
la source
Voici un exemple comment utiliser
psql
pour obtenir une liste de toutes les séquences avec leurlast_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
la source