Dans PostGIS, est-il possible de créer une vue avec un identifiant unique?


24

Lorsque je crée une vue dans PostGIS, existe-t-il un moyen d'ajouter un ID unique à cette vue? Tout comme le champ "gid" dans toute autre table PostGIS?

Modifier: Désolé, j'aurais dû l'inclure dans le message d'origine. J'utilise PostGresql 9.0 et PostGIS 1.5.

Ando

Réponses:


29

Vous devriez pouvoir utiliser la fonction row_number () comme colonne dans votre vue. Cela fonctionne pour Postgres 8.4 ou supérieur.

http://www.postgresql.org/docs/current/static/functions-window.html

SELECT * FROM
( SELECT
    ROW_NUMBER() OVER (ORDER BY column_to_sort_by ASC) AS ROW_NUMBER,
    Col1, Col2
  FROM table_name
) myview_name

Cela devrait fonctionner dans la plupart des bases de données, y compris SQL Server, Oracle et MySQL.


Cool - je vais le donner il y a et je vous répondrai.
Ando

3
Vous pouvez également vous row_number() OVER() AS "id"passer de ORDERla colonne
falcacibar

Il s'agit généralement d'une très mauvaise décision de conception, tout comme row_numberune valeur aléatoire. Vous ne pouvez pas dépendre de sa cohérence entre les SELECTs, en particulier lorsque les données sous-jacentes changent.
jpmc26

@jpmc - par sa nature même, une vue changera si ses données sous-jacentes changent. Un ID fiable ne fait pas partie des exigences de la question. Certains SIG nécessitent simplement un ID unique pour chaque entité juste pour charger la couche (par exemple ArcMap).
geographika

Je ne ferais pas confiance à ArcMap pour fonctionner correctement avec un ID incohérent. Comment savez-vous qu'il ne requière pas la base de données lorsque vous effectuez un panoramique mais pas actualisez la table attributaire? Ensuite, vous auriez un décalage en essayant de sélectionner des fonctionnalités.
jpmc26

5

Pour les anciennes versions de PostgreSQL (<= 8.3), voici une autre solution. Dans cet exemple, j'utilise un autre nom de colonne vidpour "afficher l'ID".

Créez d'abord une séquence. Utilisez-le CYCLEpour qu'il se boucle si vous atteignez la fin de la séquence.

CREATE SEQUENCE myview_vid_seq CYCLE;

Maintenant, créez une VUE qui utilise la séquence:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;

Je n'ai pas encore repris le travail pour essayer ces suggestions. Mais la solution que vous avez suggérée est-ce uniquement pour les versions Postgresql <= 8.3? J'utilise Postresql 9.0 et PostGIS 1.5.
Ando

1
Pour votre système, cela et la réponse de geographika devraient fonctionner. Ce serait un bon test de performance pour voir lequel est le plus rapide. J'ai dû faire ce que vous demandez dans votre question pour afficher les données dans QGIS, donc je suppose que vous êtes dans une situation similaire.
Mike T

1
Situation identique, je dirais - Essayer de combiner quelques couches dans une vue et nécessiter un identifiant unique pour QGIS.
Ando
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.