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

PostgreSQL Discussion :

pb Syntaxe contrainte multitables


Sujet :

PostgreSQL

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut pb Syntaxe contrainte multitables
    Bonjour

    J'ai deux tables
    RendezVous et Event
    la table rendez-vous contient des évènements. il n'y a dessus qu'une contrainte d'unicité sur la clef. en effet il peut y avoir plusieurs évènements simultanés

    certains de ses évènements sont des rendez-vous la table rendez-vous contient les infos propre au rendez-vous et les dates et heures du dit rendez-vous sont dans Event la table rendezvous contient l'id de l'évènement relatif (relation 1-0)

    j'ai besoin d'ajouter à se schémas une contrainte d'unicité sur les deux table

    un rendezvous est en gros un élément de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM rendezvous AS rdv
    INNER JOIN event AS evn USING (evn_id);
    si je décompose un peut j'ai les champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rdv_id, rdv_contact, rdv_adress, evn_id, evn_begin_dt, evn_end_dt
    il me faudrait une contrainte de non intersection sur evn_begin_dt, evn_end_dt
    mais pas sur la table event vu qu'il peu y avoir plusieurs évènements simultané mais sur la jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rendezvous INNER JOIN event USING (evn_id)
    savez vous comment écrire cela de façon simple
    Attention je suis sous PostgreSQL 7.3 donc s'il faut une fonction je n'ai que SQL comme langage.

    Merci A+JYT

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    Tout d'abord, la 7.3 dispose déjà de PL/Pgsql, PL/Tcl, PL/python, etc. Voir http://www.postgresql.org/docs/7.3/i...rammer-pl.html pour plus d'infos. Il y a peut-être une autre raison qui fait que vous ne pouvez pas utiliser autre chose que SQL ou C dans vos procédures stockées mais il est clair que ce n'est pas à cause de la version 7.3.

    Pour le reste, j'avoue ne pas avoir très bien compris. Si vous souhaitez simplement que l'heure de début soit antérieure à l'heure de fin, une contrainte CHECK suffit. Par contre, si vous souhaitez que votre contrainte d'intersection se vérifie sur toutes les lignes, cela devient plus complexe et demandera l'écriture d'une fonction en C ou en PL/pgsql (PL/sql étant trop simpliste pour cela).

  3. #3
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    non je souhaite une contrainte dans la table évent sur les dates de début et de fin que si il y a un élément référençant cet évènement dans rendez-vous

    par exemple sur le résultat de la jointure suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM rendezvous AS rdv
    INNER JOIN event AS evn USING (evn_id);
    evn_id evn_desc evn_begin_dt evn_end_dt rdv.evn_d rdv_id rdv_contac
    1        avnif       2007-03-13    2007-03-13 null         null     null
    2        iphone     2007-09-25    2007-09-25 2            1        jobs
    si j'insère un un rendezvous le 13/03/2007 je peux car il n'y a pas d'autre rendezvous à cette date
    par contre si je veux insérer un rendezvous le 25/09/2005 je ne peux pas car j'ai déjà un rendezvous.

    si je mets une simple contrainte sur event je ne pourait pas insérer un rendezvous le 13/03/2007 alors que je n'ais pas de rendezvous se jour là
    il est donc necéssaire de faire intervenir la table rendezvous dans la contrainte mais je ne sais pas comment.

    A+JYT

  4. #4
    Invité
    Invité(e)
    Par défaut
    Si un type d'événement (rendez-vous, autres...) ne peut avoir lieu qu'une fois par jour, il suffit d'ajouter une colonne pour le type d'événement et de mettre une contrainte d'unicité entre le type d'événement, et le jour de l'événement.

    Si seuls les rendez-vous ne peuvent avoir lieu qu'une seule fois par jour, il faudra traiter les rendez-vous séparément des autres événements, c'est à dire qu'ils aient leurs propres colonnes d'id, descriptions, date de début et de fin.

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    je ne peux pas j'ai une application existante et toucher au modèle de données serais très couteux il y à la dedans des requêtes de plusieurs centaines de lignes
    je me vois mal tout refaire parce qu'on ma demandé d'ajouter une contrainte

    en fait le plus simple serait en retouchant le modèle de faire hériter rendez-vous de évent et de mettre la contrainte sur rendezvous.

    mais si je fais un select * sur event verrais-je les évènements rendezvous ?
    A+JYT

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    mais si je fais un select * sur event verrais-je les évènements rendezvous ?
    A+JYT
    Oui.

    Attention cependant avec l'héritage, evn_id posera entre autres problème puisque tu pourra avoir un evn_id a 1 dans ta table d'évenements et en même temps une evn_id a 1 dans tes rendez-vous.
    Dernière modification par Deepin ; 05/07/2011 à 09h16.

  7. #7
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    ok merci pour l'info
    A+JYT

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

Discussions similaires

  1. [SQL] Syntaxe contrainte UNIQUE.
    Par Riko63 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/03/2009, 16h23
  2. Syntaxe création de table et contraintes
    Par Ralfman68 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/02/2007, 22h18
  3. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  4. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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