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

SQL Oracle Discussion :

Ajout contrainte d'unicité "conditionnelle"


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Ajout contrainte d'unicité "conditionnelle"
    Bonjour,

    je travaille sur une table ANALYSE_STATUT qui permet de garder en mémoire la statut d'une analyse en fonction d'un domaine
    Concrètement, une analyse peut avoir plusieurs statuts actif ou non sur plusieurs domaines.

    Voici le schéma :
    | ANALYSE_STATUT |
    ---------------------
    | ANL_ID (INT)
    | STA_ID (INT)
    | STA_DOMAINE (VARCHAR)
    | STA_ACTIF (BOOL)
    | DATE (DATE)
    --------------------
    Avec pour clé primaire (ANL_ID, STA_ID, DATE).

    J'ai besoin d'ajouter une contrainte d'unicité pour ne pas avoir plusieurs statuts actifs pour un même domaine, mais qu'on puisse toujours avoir plusieurs statuts inactif pour un même domaine.

    Est-ce possible ?
    Comment dois-je procéder?

    Merci de votre aide.

  2. #2
    Modérateur

    La seule manière de faire serait de passer par un trigger...
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Membre expert
    Citation Envoyé par TariC Voir le message


    Est-ce possible ?
    Comment dois-je procéder?

    Merci de votre aide.
    Vous pouvez avoir des expressions CASE dans la définition d’un index...

  4. #4
    Candidat au Club
    Citation Envoyé par JeitEmgie Voir le message
    Vous pouvez avoir des expressions CASE dans la définition d’un index...
    Super et merci de ta réponse.
    Grâce à toi j'ai pu élaborer ce script qui résout mon problème.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE UNIQUE INDEX UC_STA_ACTIF_FOR_DOMAINE ON ANALYSE_STATUT (
      CASE WHEN ACTIF = 1 THEN ANL_ID || STA_DOMAINE
           ELSE NULL
      END
    );

  5. #5
    Membre expert
    Faites 2 CASE : 1 pour chaque champ, un concat de num et varchar implique une conversion implicite et le jour où quelqu’un commencera un nom de domaine avec un nombre vous aurez une belle bug.

  6. #6
    Candidat au Club
    Bonjour et merci beaucoup de votre réponse. Je comprend le problème que vous soulevez, en revanche je n'arrive pas à comprendre votre indication pour y remédier. Sur quoi porte le 2ème CASE à mettre en place ?

  7. #7
    Expert éminent
    Un simple séparateur de champ suffit (en utilisant un caractère qui ne peut jamais être dans STA_DOMAINE

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE UNIQUE INDEX UC_STA_ACTIF_FOR_DOMAINE ON ANALYSE_STATUT (
      CASE WHEN ACTIF = 1 THEN ANL_ID || chr(1) ||  STA_DOMAINE
           ELSE NULL
      END
    );
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  8. #8
    Candidat au Club
    Super, merci !

  9. #9
    Membre expert
    Citation Envoyé par TariC Voir le message
    Sur quoi porte le 2ème CASE à mettre en place ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE UNIQUE INDEX UC_STA_ACTIF_FOR_DOMAINE ON ANALYSE_STATUT (
      CASE WHEN ACTIF = 1 THEN ANL_ID END,
      CASE WHEN ACTIF = 1 THEN STA_DOMAINE END
    );