diff --git a/docs/utils.md b/docs/utils.md index 0d2eae5..6df0284 100644 --- a/docs/utils.md +++ b/docs/utils.md @@ -4,41 +4,56 @@ Nous regroupons ici quelques fonctions réalisées au cours de formations ou d'a ## Ajout de l'auto-incrémentation sur un champ entier -Lorsqu'on importe une couche dans une table via les outils de QGIS, le champ d'identifiant choisi n'a pas le support de l'auto-incrémentation, ce qui peut poser des problèmes de l'ajout de nouvelles données. +Lorsqu'on importe une couche dans une table via les outils de QGIS, +le champ d'identifiant choisi n'a pas le support de l'auto-incrémentation, +ce qui peut poser des problèmes de l'ajout de nouvelles données. -Par exemple, pour une séquence `monschema.ma_sequence`, si la requête suivante échoue, c'est que la séquence n'est en effet pas correctement configurée : +Depuis PostgreSQL 10, on peut maintenant utiliser des **identités** +au lieu des **serial** pour avoir un champ auto-complété. +Voir par exemple l'article https://www.loxodata.com/post/identity/ + +Pour ajouter le support de l'auto-incrémentation sur un champ entier +à une table existante, on peut utiliser les commandes suivantes : ```sql -SELECT currval('"monschema"."test_id_seq"'); +-- Activer la génération automatique +ALTER TABLE "monschema"."test" ALTER "id" ADD GENERATED BY DEFAULT AS IDENTITY; + +-- Mettre la valeur de la séquence (implicite et cachée) à la valeur max du champ d'identifiant +SELECT setval(pg_get_serial_sequence('"monschema"."test"', 'id'), (SELECT max("id") FROM "monschema"."test")); ``` -Pour ajouter le support de l'auto-incrémentation sur un champ entier à une table existante, on peut utiliser les commandes suivantes: +Pour transformer les séquences créées précédemment via des `serial` en identité avec `identity`, on peut lancer : ```sql --- Création de la séquence -CREATE SEQUENCE monschema.test_id_seq; +-- Enlever la valeur par défaut sur le champ d'identifiant +ALTER TABLE "monschema"."test" ALTER COLUMN id DROP DEFAULT; --- Modification du champ pour ajouter la valeur par défaut -ALTER TABLE monschema.test ALTER COLUMN id SET DEFAULT nextval('"monschema"."test_id_seq"'); +-- Supprimer la séquence +DROP SEQUENCE IF EXISTS "monschema"."test_id_seq"; --- Modification de la valeur actuelle de la séquence au maximum du champ id -SELECT setval('"monschema"."test_id_seq"', (SELECT max(id) FROM monschema.test)); +-- Activer la génération automatique +ALTER TABLE "monschema"."test" ALTER "id" ADD GENERATED BY DEFAULT AS IDENTITY; --- Déclarer à PostgreSQL que la séquence et le champ sont liés -ALTER SEQUENCE monschema.test_id_seq OWNED BY monschema.test.id; +-- Mettre la valeur de la séquence (implicite et cachée) à la valeur max du champ d'identifiant +SELECT setval(pg_get_serial_sequence('"monschema"."test"', 'id'), (SELECT max("id") FROM "monschema"."test")); ``` -Dans l'exemple ci-dessus, le schéma est précisé. ## Création automatique d'indexes spatiaux -Pour des données spatiales volumineuses, les performances d'affichage sont bien meilleures à grande échelle si on a ajouté un **index spatial**. L'index est aussi beaucoup utilisé pour améliorer les performances d'analyses spatiales. +Pour des données spatiales volumineuses, les performances d'affichage sont bien meilleures +à grande échelle si on a ajouté un **index spatial**. L'index est aussi beaucoup utilisé +pour améliorer les performances d'analyses spatiales. -On peut créer l'index spatial table par table, ou bien automatiser cette création, c'est-à-dire créer les indexes spatiaux **pour toutes les tables qui n'en ont pas**. +On peut créer l'index spatial table par table, ou bien automatiser cette création, +c'est-à-dire créer les indexes spatiaux **pour toutes les tables qui n'en ont pas**. Pour cela, nous avons conçu une fonction, téléchargeable ici: https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042 -On doit copier/coller le script SQL de cette page "gist" dans la **fenêtre SQL** du Gestionnaire de bases de données de QGIS, puis lancer la requête avec **Exécuter**. On peut ensuite vider le contenu de la fenêtre, puis appeler la fonction `create_missing_spatial_indexes` via le code SQL suivant: +On doit copier/coller le script SQL de cette page `GIST` dans la **fenêtre SQL** +du Gestionnaire de bases de données de QGIS, puis lancer la requête avec **Exécuter**. +On peut ensuite vider le contenu de la fenêtre, puis appeler la fonction `create_missing_spatial_indexes` via le code SQL suivant : ```sql -- On lance avec le paramètre à True si on veut juste voir les tables qui n'ont pas d'index spatial