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 :

contrainte d'unicite sur deux champs


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut contrainte d'unicite sur deux champs
    Bonjour.
    Je souhaite poser une contrainte d'unicté sur deux champs avec une condition sur un des champs. Un petit exemple pour mieux comprendre.

    ma_table ( id_table, champ1 , champs2 );

    il faut que champ1 soit unique pour une valueur de champ2 = 1.

    Cela est il possible avec les contrainte ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    Voici un exemple de création de table avec une contrainte unique sur deux colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE exemple (
        a integer,
        b integer,
        c integer,
        UNIQUE (a, c)
    );
    Cela veut dire que tout couple (a,c) sera unique dans la table exemple.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut
    Merci pour la reponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE exemple (
        a integer,
        b integer,
        c integer,
        UNIQUE (a, c)
    );
    Mais il me faut l'unicte de a avec une certaine valeur de c
    par exemple pas de doublons de a avec c= 1
    a | c
    1 | 2 -> ok
    1 | 2 -> ok
    1 | 2 -> ok
    1 | 1 -> ok
    1 | 1 -> NON

  4. #4
    Membre habitué Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Points : 197
    Points
    197
    Par défaut
    As tu essayé avec les triggers ? Les Triggers ne sont que des fonctions qui tolèrent ou non l'insertion (par exemple) d'un champs. Dans ta fonction, selon les valeurs en entré, tu accèptes ou non l'insertion.
    Sud04

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    tiens voilà une série de tutoriaux.

    Je te conseille de lire les parties sur le DAL et le BLL

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 122
    Points
    122
    Par défaut
    J'y pense (merci Elmoricq )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE exemple (
        a integer,
        b integer,
        c integer,
        CHECK ( c != a )
    );
    Ca devrai marcher ça

    Sinon les docs sont .

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2006
    Messages : 134
    Points : 81
    Points
    81
    Par défaut
    finalement j'ai poser un trigerr before insert qui appelle une fonction qui verifie l'unicité.

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut unicité sur 2 champs
    Citation Envoyé par mikebranque Voir le message
    finalement j'ai poser un trigerr before insert qui appelle une fonction qui verifie l'unicité.
    bonjour,

    J ai une table enzyme qui contient 4 champs :
    - enzymeID : clé primaire, auto-increment
    - EC
    - nameE
    - Family

    je voudrais qu'il n'y ait pas 2 paires identiques sur les champs EC et NameE.
    J'ai créé un index unique sur les champs EC et NameE, mais cela ne fonctionne pas.

    comment utiliser la fonction trigger pour vérifier l'unicité des lignes insérées?

    merci de votre aide

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par juzii Voir le message
    bonjour,

    J ai une table enzyme qui contient 4 champs :
    - enzymeID : clé primaire, auto-increment
    - EC
    - nameE
    - Family

    je voudrais qu'il n'y ait pas 2 paires identiques sur les champs EC et NameE.
    J'ai créé un index unique sur les champs EC et NameE, mais cela ne fonctionne pas.

    comment utiliser la fonction trigger pour vérifier l'unicité des lignes insérées?

    merci de votre aide
    Pourtant ça devrait marcher. Peux-tu nous montrer la contrainte et des exemples d'enregistrements ?

    En général il faut éviter les triggers quand on peut car les triggers conduisent vite à des usines à gaz et des comportements inattendus (trigger qui active un autre trigger... que l'on avait oublié bien sûr , à quoi sert-il déjà ? Ah oui ! Mais si on le touche alors ouïe là ça ne marchera plus...)

    Très très très souvent on s'en sort avec des combinaisons de contraintes UNIQUE, CHECK et clés étrangères, parfois en dénormalisant un peu, mais sans trigger.

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut contrainte d unicite sur 2 champs
    re-bonjour,

    ben oui moi non je ne comprends pourquoi ca ne marche pas...

    exemple de doublons :

    EnzymeID EC NameE Family Nbgene
    1 5.4.2.2 nom1 famille1 no
    2 5.3.1.9 nom2 famile2 no
    3 5.3.1.9 nom2 famille2 no

    je souhaite supprimer la ligne 3.

    j ai defini EnzymeID comme cle primaire et j ai cree un index unique sur EC et NameE

    Alter table 'enzyme' add unique 'unique_ec_namee' ('EC', 'NameE')

    apres j ai cree ma base sur un serveur local phpmyadmin et je ldois la remplir via un code perl

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Etrange...

    Quels sont les types de 2 colonnes ? N'y-a-t-il pas des blancs à la fin de l'une d'elles ?

    Edit : pourquoi ces quotes ?

    Essaies ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE enzyme ADD CONSTRAINT unique_ec_namee UNIQUE(EC, NameE);
    Et pourquoi parles-tu de phpmyadmin pour PostgreSQL ?

    Veux-tu dire phpPGadmin ou bien es-tu sous MySQL ? (la syntaxe n'a pas l'air d'une syntaxe Postgres correcte)

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut contrainte d'unicite sur 2 champs
    EC et nameE sont de type varchar.

    et en fait je remplis cette base a partir d un tableau excel que j'ai enregistre sous format txt, separation par tabulation
    dans ce tableau, sur chaque ligne j 'ai differentes infos :
    nom de reaction - ec -nameE-compartiment-family-type de reaction-nbgene-gene-equation

    via perl je split le fichier au niveau des tabulations et je recupere les valeurs dont j'ai besoin (ici, ec-namee-family et nbgene). j'envois ces valeurs dans la base.

    apres dans mon fichier texte, sur certaines lignes, certaines valeurs ne sont pas renseignees comme ec, par exemple. mais normalememt (j'ai verifie en faisant affiche le tableau dans un fichier a part) quand il n'y a pas de valeur, perl considere "la case'' comme vide, elle n'est pas supprimee

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 103
    Points : 57
    Points
    57
    Par défaut contrainte d unicite sur 2 champs
    je travaille sur mysql, mais sur phpmyadmin 5.0.51b sous serveur wampserver 2.0


    j'ai essaye la requete que vous m'avez indique, elle semble fonctionner, puisque maintenant quand j essaie de remplir la table depuis perl, j ai un message d erreur qui m indique que l'insertion a echoue car il a des entrees doubles.

    maintenant nouveau probleme, comment continuer l'insertion en 'sautant' les doublons...

Discussions similaires

  1. [AC-2003] Créer une contrainte d'unicité basé sur deux champs(hors clé primaire)
    Par adelcrb dans le forum Modélisation
    Réponses: 1
    Dernier message: 31/08/2013, 21h06
  2. Réponses: 1
    Dernier message: 29/06/2011, 20h03
  3. Contrainte d'unicité sur 2 champs d'un domaine
    Par DevServlet dans le forum Grails
    Réponses: 6
    Dernier message: 22/09/2010, 23h23
  4. Réponses: 5
    Dernier message: 17/07/2008, 11h40
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

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