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

SQL Oracle Discussion :

Ajout contrainte d'unicité "conditionnelle"


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 9
    Points
    9
    Par défaut 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
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    La seule manière de faire serait de passer par un trigger...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par TariC;

    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    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
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    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
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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 / QRCode et Images PNG ou BMP

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Super, merci !

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    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
    );

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

Discussions similaires

  1. [phpPgAdmin] Ajout contraintes d'unicité
    Par ClapTrap dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/01/2015, 09h11
  2. QGIS : lenteur pour afficher les listes des vues dans "Ajouter une table PostGIS"
    Par fafa63 dans le forum SIG : Système d'information Géographique
    Réponses: 2
    Dernier message: 11/07/2014, 19h04
  3. gestion des contraintes d'unicité
    Par GMI3 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/12/2006, 17h00
  4. Ajout contrainte FOREIGN KEY
    Par loukili81 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 22/03/2006, 22h49
  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