Czy w PostGIS można utworzyć widok z unikalnym identyfikatorem?

24

Czy podczas tworzenia widoku w PostGIS można dodać unikalny identyfikator do tego widoku? Podobnie jak pole „gid” w dowolnej innej tabeli PostGIS?

Edycja: Przepraszam, że powinienem był zamieścić to w oryginalnym poście. Korzystam z PostGresql 9.0 i PostGIS 1.5.

Ando

Ando
źródło

Odpowiedzi:

29

Powinieneś być w stanie użyć funkcji row_number () jako kolumny w twoim widoku. Działa to dla Postgres 8.4 lub nowszego.

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

Powinno to działać w większości baz danych, w tym SQL Server, Oracle i MySQL.

geografia
źródło
Fajnie - dam to temu i oddzwonię.
Ando
3
Możesz także obejść się row_number() OVER() AS "id"bez ORDERkolumny
falcacibar,
Jest to zazwyczaj bardzo zła decyzja projektowa, ponieważ row_numberjest to w rzeczywistości losowa wartość. Nie można polegać na tym, że jest on spójny między SELECTs, szczególnie w przypadku zmiany danych bazowych.
jpmc26
@jpmc - ze swej natury widok zmieni się, jeśli zmienią się jego dane bazowe. Wiarygodny identyfikator nie jest częścią wymagań pytania. Niektóre GIS wymagają po prostu unikalnego identyfikatora dla każdej funkcji, aby załadować warstwę (np. ArcMap).
geografia
Nie ufam ArcMap, że działa poprawnie z niespójnym identyfikatorem. Skąd wiesz, że nie wymaga bazy danych podczas przesuwania, ale nie odświeżania tabeli atrybutów? Wtedy miałbyś niedopasowanie, próbując wybrać funkcje.
jpmc26
5

Dla starszych wersji PostgreSQL (<= 8,3), oto inne rozwiązanie. W tym przykładzie używam innej nazwy kolumny viddla „view ID”.

Najpierw utwórz sekwencję. Użyj, CYCLEaby zapętlał się, gdy dojdziesz do końca sekwencji.

CREATE SEQUENCE myview_vid_seq CYCLE;

Teraz utwórz WIDOK wykorzystujący sekwencję:

CREATE OR REPLACE VIEW myview AS 
 SELECT nextval('myview_vid_seq'::regclass) AS vid, mytable.*
 FROM mytable;
Mike T.
źródło
Nie wróciłem jeszcze do pracy, aby wypróbować te sugestie. Ale rozwiązanie, które zasugerowałeś, dotyczy tylko wersji Postgresql <= 8.3? Korzystam z Postresql 9.0 i PostGIS 1.5.
Ando,
1
W twoim systemie, zarówno to, jak i odpowiedź geograficzna powinny zadziałać. Dobrym testem wydajności byłoby sprawdzenie, który z nich jest szybszy. Musiałem zrobić to, o co pytasz w swoim pytaniu, aby wyświetlić dane w QGIS, więc zgaduję, że jesteś w podobnej sytuacji.
Mike T
1
Identyczna sytuacja, powiedziałbym - Próbuję połączyć kilka warstw w widoku i wymagać unikalnego identyfikatora dla QGIS.
Ando,