Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/06/2007, 15h13   #1
Membre du Club
 
Inscription : février 2006
Messages : 134
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : février 2006
Messages : 134
Points : 48
Points : 48
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 ?
mikebranque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 16h01   #2
Membre habitué
 
Inscription : mars 2007
Messages : 107
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 107
Points : 106
Points : 106
Voici un exemple de création de table avec une contrainte unique sur deux colonne :

Code :
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.
dinguot est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2007, 13h43   #3
Membre du Club
 
Inscription : février 2006
Messages : 134
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : février 2006
Messages : 134
Points : 48
Points : 48
Merci pour la reponse.
Code :
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
mikebranque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 17h08   #4
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
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.
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 17h28   #5
Membre habitué
 
Inscription : mars 2007
Messages : 107
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 107
Points : 106
Points : 106
tiens voilà une série de tutoriaux.

Je te conseille de lire les parties sur le DAL et le BLL
dinguot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2007, 17h53   #6
Membre habitué
 
Inscription : mars 2007
Messages : 107
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 107
Points : 106
Points : 106
J'y pense (merci Elmoricq )

Code :
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 .
dinguot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 13h52   #7
Membre du Club
 
Inscription : février 2006
Messages : 134
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : février 2006
Messages : 134
Points : 48
Points : 48
finalement j'ai poser un trigerr before insert qui appelle une fonction qui verifie l'unicité.
mikebranque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 11h43   #8
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 101
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 101
Points : 25
Points : 25
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
juzii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 15h10   #9
Membre confirmé
 
Inscription : janvier 2006
Messages : 178
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : janvier 2006
Messages : 178
Points : 208
Points : 208
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.
rbaraer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 15h47   #10
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 101
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 101
Points : 25
Points : 25
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
juzii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 16h00   #11
Membre confirmé
 
Inscription : janvier 2006
Messages : 178
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : janvier 2006
Messages : 178
Points : 208
Points : 208
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 :
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)
rbaraer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 16h19   #12
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 101
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 101
Points : 25
Points : 25
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
juzii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2008, 16h28   #13
Nouveau Membre du Club
 
Inscription : juillet 2008
Messages : 101
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 101
Points : 25
Points : 25
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...
juzii est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h18.


 
 
 
 
Partenaires

Hébergement Web