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 :

Contrainte unique particulière


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 142
    Par défaut Contrainte unique particulière
    Bonjour,

    J'ai une table comportant 3 colonnes dont une qui défini l'enregistrement comme par défaut (IS_DEFAUT)! colonne qui n'accepte que la valeur 0 ou 1 ! cependant quand on insert un enregistrement la colonne IS_DEFAUT est à 0 automatiquement .

    Ma question est comment je peux empêcher d'avoir plusieurs enregistrement définit comme par défaut ? c'est à dire comment éviter qu'il y plusieurs 1 dans cette colonne ?

    Je ne peu utiliser la contrainte Unique car il y a forcement plusieurs 0 !

    Il y a t'il une solution simple (sans passer par des trigger et des sequences) pour avoir le même effet que la contrainte Unique mais appliqué uniquement sur le 1 ?

    Merci beaucoup

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Il faut faire un trigger qui vérifie que SUM(IS_DEFAULT) <= 1 sur l'ID concerné.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 142
    Par défaut
    ok merci pour cette reponse !

    comment puis je recupérer la valeur retournée par le trigger ? car c'est une fonction PL/SQL qui execute un Insert !

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    récupérer quel valeur ? Le trigger part en erreur si un IS_DEFAULT et déjà détecté donc INSERT en erreur et gestion de cette erreur dans la procédure... point

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 142
    Par défaut
    ok je comprend je ne connais pas trop les triggers ...

    Comment puis-je créer un instruction pour que le trigger soit en erreur ?

    Dsl je suis pas tres calé

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    RAISE_APPLICATION_ERROR

    Il y a un tutoriel PL/SQL sur ce site sinon

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Citation Envoyé par Stouille89 Voir le message
    Il y a t'il une solution simple (sans passer par des trigger et des sequences) pour avoir le même effet que la contrainte Unique mais appliqué uniquement sur le 1 ?
    Oui, vous pouvez utiliser un index fonction (au moins avec XE et la version Entreprise):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    SQL> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production
     
    SQL> create table t(x int, is_default int default 0);
     
    Table created.
     
    SQL> create unique index i on t (case when(is_default = 1) then 1 end);
     
    Index created.
     
    SQL> insert into t(x) values(1);
     
    1 row created.
     
    SQL> insert into t(x) values(2);
     
    1 row created.
     
    SQL> insert into t values(3,1);
     
    1 row created.
     
    SQL> insert into t values(2,1);
    insert into t values(2,1)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (O.I) violated
     
     
    SQL> select * from t;
     
             X IS_DEFAULT
    ---------- ----------
             1          0
             2          0
             3          1

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 142
    Par défaut
    Ok merci pour vos aides ! j'ai résolu mon problème

    Merci pifor c'est exactement ce que je recherché ! apres test les index fonction fonctionnent tres bien sur ORACLE 9

    bye

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut
    merci pour la réponse
    et si je veux avoir une seule valeur 1 pour is_default par la méme valeus de x

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

Discussions similaires

  1. [hibernate] Violation de contrainte unique
    Par miyabi dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/06/2006, 14h52
  2. Réponses: 2
    Dernier message: 13/02/2006, 11h13
  3. Nested table et contrainte UNIQUE
    Par evlad dans le forum Oracle
    Réponses: 7
    Dernier message: 05/01/2006, 10h13
  4. [Hibernate] Surrogate key et contraintes unique
    Par mauvais_karma dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/11/2005, 16h41
  5. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56

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