Skip to content

Commit

Permalink
Utils - Utilisation de IDENTITY au lieu de SERIAL pour l'auto-incréme…
Browse files Browse the repository at this point in the history
…ntation
  • Loading branch information
mdouchin committed Apr 25, 2024
1 parent f8221f8 commit 450321a
Showing 1 changed file with 31 additions and 16 deletions.
47 changes: 31 additions & 16 deletions docs/utils.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 450321a

Please sign in to comment.