187 votes

Lister toutes les séquences dans un db Postgres 8.1 avec SQL

Je suis en train de convertir une base de données de postgres à mysql.

Puisque je ne peux pas trouver un outil qui fait le truc lui-même, je vais convertir toutes les séquences postgres en ids autoincrémentés dans mysql avec la valeur autoincrémentée.

Donc, comment puis-je lister toutes les séquences dans une Postgres DB ( 8.1 ) avec des informations sur la table dans laquelle il est utilisé, la prochaine valeur etc. avec une requête SQL ?

Sachez que je ne peux pas utiliser le information_schema.sequences dans la version 8.4.

1 votes

Il faut noter que vous faites la conversion de la mauvaise façon. Depuis qu'Oracle a racheté Sun, ils ont lentement tué MySQL, donc à moins que vous ne méprisiez votre client (auquel cas vous devriez tout simplement démissionner), vous devriez vous en tenir à PostgreSQL, car aucune société (pro-monopole ou non) ne peut venir, absorber PostgreSQL et le remplacer par sa propre base de données.

0 votes

@John Je dirais qu'il y a un milliard et une autres raisons de s'en tenir à postgres, et un milliard d'autres de ne jamais toucher à mysql, mais oui - votre point est toujours très valable :)

1 votes

@John à l'époque (2009) nous avions besoin d'une base de données plus simple à gérer - et mysql était mieux couplé à php

324voto

Anand Chitipothu Points 1440

La requête suivante donne les noms de toutes les séquences.

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

Typiquement, une séquence est nommée comme ${table}_id_seq . Une simple correspondance de motifs regex vous donnera le nom de la table.

Pour obtenir la dernière valeur d'une séquence, utilisez la requête suivante :

SELECT last_value FROM test_id_seq;

7 votes

Le site ${table}_id_seq l'indice était utile

2 votes

${table}_${column}_seq pour les séquences auto-créées

108voto

Raveren Points 4772

Notez, qu'à partir de PostgreSQL 8.4 vous pouvez obtenir tous des informations sur les séquences utilisées dans la base de données via :

SELECT * FROM information_schema.sequences;

Comme j'utilise une version plus récente de PostgreSQL (9.1) et que j'ai cherché la même réponse partout, j'ai ajouté cette réponse pour la postérité et pour les futurs chercheurs.

1 votes

Protip : triez les réponses par "actif". La postérité devient de plus en plus pertinente à mesure que les questions deviennent de plus en plus anciennes..

1 votes

Cool. Et on dirait que si je choisis la méthode de tri "active", le site se souvient tout de suite de ce paramètre (là, je fouillais dans les préférences pour trouver un endroit où le mettre par défaut, sans succès). Hm, maintenant si seulement nous avions une option "la réponse acceptée par le demandeur ne l'emporte pas automatiquement sur tout le reste", que serait un véritable grand la victoire pour la postérité.

0 votes

Note bien sûr cette table a été introduite dans PG 8.4, je préfère dire PG 8.2 après la documentation officielle : postgresql.org/docs/8.2/infoschema-sequences.html

69voto

Lancement psql avec le -E ("echo the actual queries generated by \d et autres commandes à barres obliques inversées"), puis saisissez la commande \ds pour lister toutes les séquences. Vous devriez voir quelque chose comme ceci :

# \ds
********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('S','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
**************************

                     List of relations
 Schema |              Name              |   Type   | Owner 
--------+--------------------------------+----------+-------
 public | assignments_id_seq             | sequence | root
 public | framework_users_id_seq         | sequence | root
 public | lending_items_id_seq           | sequence | root
 public | proxy_borrower_requests_id_seq | sequence | root
 public | roles_id_seq                   | sequence | root
 public | stack_requests_id_seq          | sequence | root
(6 rows)

Pour examiner une séquence particulière, vous pouvez alors exécuter \d <sequence name> :

# \d lending_items_id_seq
********* QUERY **********

(...about four queries...)

**************************

                    Sequence "public.lending_items_id_seq"
  Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache 
--------+-------+---------+---------------------+-----------+---------+-------
 bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
Owned by: public.lending_items.id

1 votes

Je n'ai pas seulement besoin de la liste des séquences, j'ai besoin de la table dans laquelle elle est utilisée, de la valeur suivante, etc. Et je dois faire cela en SQL

0 votes

Ensuite, pour chaque séquence, faites \d <nom> (étant toujours dans psql -E)

0 votes

Encore une fois, ceci n'est pas en SQL et ne montre pas à quelle table la séquence est attachée

30voto

apelliciari Points 1833

Après un peu de douleur, je l'ai eu.

la meilleure façon d'y parvenir est de répertorier toutes les tables

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

puis, pour chaque table, listez toutes les colonnes avec des attributs

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

puis, pour chaque colonne, tester si elle a une séquence

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

et ensuite, obtenir les informations sur cette séquence

select * from <sequence_name>

17voto

bbh Points 331

Info séquence : valeur max

SELECT * FROM information_schema.sequences;

info séquence : dernière valeur

SELECT * FROM <sequence_name>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X