IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Ajout d'une colonne clef primaire dans une vue sur postgis


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Tours
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Tours

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Points : 11
    Points
    11
    Par défaut Ajout d'une colonne clef primaire dans une vue sur postgis
    Bonjour.

    Je travaille sur postgis sur la création d'un atlas de mammifères. Afin de représenter les résultats de plusieurs tables j'ai pu faire une requête pour afficher toutes les données sur qgis sous la forme d'une vue (create view). Le souci c'est qu'en ajoutant une colonne (non d'espèce=> "lb_nom") la colonne que j'avais choisis comme clef primaire (code5km) perd sa règle d'unicité. Je souhaite donc pouvoir ajouter une colonne qui puisse servir de clef primaire pour afficher la vue sur QGis.

    la vue de base à cette forme là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    SELECT maille_5km.code5km,
    maille_5km.geom AS geom_mailles,
    count(DISTINCT lot_pelote.id_site_c) AS "nb lot",
    count(pelote.id_lot_p) AS "nb pelotes",
    Pelote.taxref_select.lb_nom,
    CASE
    WHEN (sum(proie.effectif) > 0) THEN sum(proie.effectif)
    ELSE (0)::bigint
    END AS nb_proies,
    count(DISTINCT taxref_select.cd_nom) AS "nb espece"
    FROM faune_flore.maille_5km,
    ((((pelote.site_collecte
    LEFT JOIN pelote.lot_pelote ON ((site_collecte.id_site_c = lot_pelote.id_site_c)))
    LEFT JOIN pelote.pelote ON ((lot_pelote.id_lot = pelote.id_lot_p)))
    LEFT JOIN pelote.proie ON ((pelote.id_pelote = proie.id_pelote)))
    LEFT JOIN pelote.taxref_select ON ((proie.cd_nom = taxref_select.cd_nom)))
    WHERE st_intersects(maille_5km.geom, site_collecte.geom)
    GROUP BY maille_5km.code5km,Pelote.taxref_select.lb_nom
    je pensais ajouter simplement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create or replace view atlas_mammals
    add column [ID_PK] integer NOT NULL DEFAULT nextval('atlas_mammals');
    ...devant mais manifestement il me manque un truc.

    Le message d'erreur me dis:

    syntax error at or near "add"
    LINE 2: add column [ID_PK] integer NOT NULL DEFAULT nextval('atlas_m...

    Est ce que quelqu'un aurait une idée ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    A moins que PostGis fonctionne différemment des autres SGBDs, une vue se base sur une requête.
    On n'ajoute pas une colonne à une vue, mais on redéfinie la requête sur laquelle se base la vue.

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    On peut créer des "pseudo-colonnes" via des vues en recombinant certaines colonnes des tables sous-jacentes, par exemple en concaténant plusieurs colonnes, ou en extrayant une sous-partie d'une colonne. En aucun cas on ne peut créer de colonne identifiante dans une vue.
    Les vues sont un accès logique aux données.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Si je comprend bien, l'outil que vous uitilisez exige qu'une colonne soit unique (ne pouvez vous pas simplement spécifier plusieurs colonnes pour la clef ? vous retrouveriez votre unicité)

    Sinon vous pouvez simplement ajouter une ROW_NUMBER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT 
    ROW_NUMBER() OVER() AS clef,
    maille_5km.code5km,
    maille_5km.geom AS geom_mailles,
    ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Tours
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Tours

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Points : 11
    Points
    11
    Par défaut
    Merci pour vos réponses je comprend mieux maintenant ce que représente une vue.

    Du coup j'ai changé et au lieu de créer une vue à partir de ma requête j'ai crée une table. Avec ce format là je n'ai même pas besoin de clef primaire pour afficher sur QGis (il est possible de faire directement "charger en tant que nouvelle couche").

    Je pensais aussi que la table serait figée mais manifestement si je modifie des données dans les tables de base ça met aussi à jours la requête et donc la table . Que c'est beau la technologie .

    Donc problème résolut sans avoir à modifier le code SQL ^^. Désolé de vous avoir dérangé pour si peu même si vos commentaires m'on bien servis pour aller voir et essayer d'autres choses ailleurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/04/2018, 10h16
  2. Réponses: 3
    Dernier message: 15/05/2017, 10h19
  3. Réponses: 1
    Dernier message: 01/05/2011, 20h36
  4. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  5. Comment comment définir une clef primaire dans une table??
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/02/2005, 21h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo