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 et SQL. Discussion :

Contrainte d'unicité double avec booléen


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut Contrainte d'unicité double avec booléen
    Bonjour,

    J'aimerais savoir si il était possible de créer une contrainte UNIQUE avec 2 champs, dont un booléen, mais uniquement sur sa valeur TRUE ?
    Je m'explique, j'ai deux champs "code" et "actif" (+ d'autres champs) et je voudrais qu'on ne puisse avoir pour chaque code, qu'une seule fois le champ "actif" à TRUE.

    J'ai pas mal cherché sur le net mais je n'ai pas l'impression qu'on puisse le faire simplement.
    Auriez-vous une proposition simple à mettre en place pour ce cas de figure ?

    Merci par avance!

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Bonjour,

    Il y a une ambiguïté dans l'explication de ta contrainte.
    Peux-tu donner un exemple des données de départ et le résultat souhaité pour mieux cerner le souci.

    Cordialement,

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bien sur, j'ai donc dans ma table une 10aines de champs, dont mes deux premiers CODE et ACTIF.
    Voilà ce que j'aimerais avoir :
    ID CODE ACTIF
    1 111 TRUE
    2 111 FALSE
    3 111 FALSE
    4 222 TRUE
    5 222 FALSE

    Ou bien :
    ID CODE ACTIF
    1 111 FALSE
    2 111 FALSE
    3 111 FALSE
    4 222 TRUE
    5 222 FALSE

    Voilà ce que je ne veux pas avoir :
    ID CODE ACTIF
    1 111 TRUE
    2 111 TRUE
    3 111 FALSE

    Pour chaque code, le champ actif ne peut se retrouver une seule fois à TRUE.

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Re-bonjour,

    J'imagine que tu veux dire :
    Pour chaque code, le champ actif ne peut se retrouver qu'une seule fois à TRUE.
    Et peux-tu expliquer le fonctionnement ou ce qui se passerait exactement avec la contrainte que tu veux imposer :
    - Tu veux "interdire" la saisie de nouvelle valeur d'actif à "TRUE" ou d'en modifier pour un code si cela existe déjà ?
    - ou Tu as déjà des valeurs et tu veux faire un filtre ou extraction (ce qui se rapporte à la section "Requêtes et SQL" où tu as postée ta question).

    Cordialement,

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Le champ "ACTIF" vient d'être ajouté à ma table, pour l'instant toutes les valeurs sont à FALSE dans ma table.
    Pour chaque code on peut retrouver :
    - Plusieurs occurences avec le champ ACTIF à FALSE (voir toutes)
    - Une occurence avec le champ ACTIF à TRUE

    Donc logiquement oui, si on ajoute une ligne avec le champ ACTIF à TRUE alors qu'il y en a déjà une pour ce code, ça devrait lever une exception.

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 841
    Points : 7 975
    Points
    7 975
    Par défaut
    Avec la version d'Access que tu indiques, cette contrainte ne pourra pas être appliquée dans une table lors de la modification ou ajout des valeurs .
    A partir de Access 2010, cela est possible avec les macro de données, mais désolé c'est un domaine que je n'ai pas encore eu l'occasion d'explorer.

    Sur toutes les versions d'Access, l'opération devrait se faire dans un formulaire et sur l'évènement AvantMiseAJour ou AprèsMiseAjour du champ actif, il faut lancer une procédure qui vérifie que le code correspondant ne contient pas déjà d'Actif avec une valeur VRAI.

    Cordialement,

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    C'est ce que j'ai fait du coup !

    Merci de ta réponse.

    Je laisse le sujet ouvert jusqu'à demain au cas ou quelqu'un aurait une solution, même à titre informatif.

    Bonne journée à vous !

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/09/2008, 15h53
  2. Ensemble trié/triable avec contrainte d'unicité
    Par teletexte dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 27/02/2008, 15h40
  3. Réponses: 6
    Dernier message: 12/12/2006, 13h30
  4. Réponses: 2
    Dernier message: 30/08/2006, 15h08
  5. contrainte d'unicité un peu spéciale....
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/11/2004, 17h54

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