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 d'unicité sur des couples


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut contrainte d'unicité sur des couples
    Bonjour,
    je rencontre un petit souci sur la contrainte d'unicité.

    J'ai une table "table1" avec 4 colonnes

    sequence
    ope_id
    cnv_id
    ses_id

    J'aimerai que ope_id et ses_id soit unique.
    donc j'ai mis comme contrainte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TABLE Etable1 ADD CONSTRAINT UNI_OPE_SESSION UNIQUE (OPE_ID, SES_ID);
    Voici un exemple de jeu de donnée :

    seq-----ope_id--------cnv_id----ses_id
    1---------30-----------null---------10
    2---------20-----------null---------10
    3---------null----------10----------20
    4---------null----------20----------20


    Il plante sur les deux lignes en rouge......
    Mais j'ai pas envie qu'il plante ici !! car si ope_id est null, ça veut dire que j'ai rempli la colonne cnv_id

    avez vous une idée ?

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Peut être indexer (Nvl(OPE_ID, CNV_ID),SES_ID) mais, vos explications sont loin d'être claires.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    je veux juste que l'unicité soit respecté lors d'un insert quand ope_id est non null.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    d'après ce que j'ai pu trouver sur le net, il faut passer par des triggers :s ! or c'est interdit ici :s !

    Donc une autre solution, serait d'utiliser la clause MERGE.

    Mais j'ai l'impression que le MERGE est plus lent que le insert.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MERGE INTO OPERATION USING dual ON (operation.ope_id = 100)
    WHEN NOT MATCHED THEN
      INSERT (operation.ope_id,operation.ope_num_operation)
      VALUES (100,'XXXX');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO OPERATION (operation.ope_id,operation.ope_num_operation)
      VALUES (100,'XXXX');
    J'ai l'impression que le merge est beaucoup plus lent que le insert ....

    J'aimerai avoir confirmation par des experts.

    J'ai fait le test sur une table bidon là, et le insert simple c'est 0,01s et le merge c'est 0.24s !!!

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Pour la première question, oui c'est normal, une contrainte d'unicité est violée quand les colonnes non nulles font doublon), c'est la norme SQL.
    Pour le reste, j'ai pas bien compris le rapport avec merge
    Cordialement,
    Franck.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    mon objectif, c'est de ne pas insérer des doublons, donc j'avais pensé à mettre une contrainte unique sur les deux colonnes.

    Etant impossible, je me rabat sur la clause MERGE afin de ne pas insérer des doublons comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MERGE INTO EXTRACTION USING dual ON (EXTRACTION .ope_id = 600 and EXTRACTION .ses_id = 100)
    WHEN NOT MATCHED THEN
      INSERT (EXTRACTION.ope_id,EXTRACTION.ses_id)
      VALUES (600,100);
    Concernant la remarque de Oishiiii, oui et non !!! !! Mais de toute façon, on peut plus revenir en arrière :s !, le choix est déjà fait donc on doit faire avec !!!

    Je récupère des identifiants techniques, 7 au totale (ope_id, cnv_id, sto_id, shi_id....) de certaines tables qu'on les stocke dans une table unique EXTRACTION_IDENTIFIANT.

  7. #7
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Bonsoir,

    Citation Envoyé par ekremyilmaz Voir le message
    Voici un exemple de jeu de donnée :

    seq-----ope_id--------cnv_id----ses_id
    1---------30-----------null---------10
    2---------20-----------null---------10
    3---------null----------10----------20
    4---------null----------20----------20


    Il plante sur les deux lignes en rouge......
    Mais j'ai pas envie qu'il plante ici !! car si ope_id est null, ça veut dire que j'ai rempli la colonne cnv_id

    avez vous une idée ?
    Il y a clairement un problème de modélisation.
    Il faudrait plus d'information pour en être certain mais a priori vous devriez avoir deux tables:

    t1(ope_id, ses_id)
    t2(cnv_id, ses_id)

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 12/06/2014, 10h41
  2. MySQL contrainte d'unicité sur chaine de caractère.
    Par waflyx dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/08/2009, 13h58
  3. Réponses: 7
    Dernier message: 10/09/2008, 15h53
  4. contrainte d'unicite sur deux champs
    Par mikebranque dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 17/07/2008, 16h28
  5. [MCD] Contrainte d'unicité sur un attribut
    Par piloupy dans le forum PowerAMC
    Réponses: 2
    Dernier message: 22/01/2008, 16h55

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