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

PL/SQL Oracle Discussion :

Problème d'insertion, génération de clé primaire


Sujet :

PL/SQL Oracle

Vue hybride

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 190
    Par défaut Problème d'insertion, génération de clé primaire
    Bonjour,
    ds una table table1(attr1(cle primaire), atrrib2,attrib3)
    je fais une insertion
    insert into table1 (atrrib2,attrib3) values (val2,val3);
    sachant que j'ai fait un trigger sur la table1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE TRIGGER TIB_TABLE1 before insert
    on  table1 for each row
    declare
        integrity_error  exception;
        errno            integer;
        errmsg           char(200);
        dummy            integer;
        found            boolean;
    begin
        select SEQ_Table1.NEXTVAL INTO :new.attr1 from dual;
    exception
        when integrity_error then
           raise_application_error(errno, errmsg);
    end ;
    pour incrimenter l'id, mais lorsque j'essaie de faire l'insertion,
    ca me retourne
    ORA-00001: unique constraint (PK_TABLE1) violated
    ORA-06512: at "dispatch_trt", line 14
    pourtant le trigguer devrait s'occuper de la generation de la cle primaire

    Cdlt
    Sallemel

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Par défaut
    Bonjour,

    Le trigger en question va chercher la "nextval" de la sequence, et l'affecte à la colonne faisant office de clé primaire.

    - Est ce que la colonne a été supprimée puis crée ?


    Ce que dit l'erreur c'est que la valeur existe déjà dans la table (d'ou la violation de contrainte).

    Question : pourquoi passé par trigger et ne pas mettre le SEQ_Table1.NEXTVAL
    dans la clause insert ?

    Laurent

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 190
    Par défaut
    Bonjour,
    pour la cle primaire, non elle n'a pas ete supprime puis cree
    j'ai cree la table
    ensuite, j'ai ajoute la sequence et le trigguer

    (pour le trigguer, j'en ai besoin ds d'autre contexte, a partir d'une api java)
    mais, je suppose que de mettre le next val ds insert ca revient au meme , que de ne rien mettre et laisser le trigguer setter la nouvelle valeur

    Cdlt
    Sallemel

  4. #4
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    il faut que le prochain numéro de ta séquence soit supérieur au max(attr1présent dans ta table
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    La séquence est juste une suite de nombres, complètement indépendante des valeurs de ta table. A chaque fois que tu appelles nextval, elle est incrémentée.

    Le trigger n'est donc efficace que si :
    - tu ne fasses des insert QUE en passant via le trigger, c'est à dire qu'il ne faut jamais insérer directement ta clé primaire via une requête insert, sinon tu risques d'avoir des doublons
    - tu ne réinitialises jamais ta séquence, à moins que la table soit vide
    - tu ne dépasses pas la valeur max de la séquence (à ce moment là elle reprend à zéro), cela dit la valeur max est très élevée...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Citation Envoyé par lallio Voir le message
    Question : pourquoi passé par trigger et ne pas mettre le SEQ_Table1.NEXTVAL dans la clause insert ?
    Parce que dans le code qui fait l'insert, tu n'es pas censé t'occuper de générer une clé primaire, tu n'es pas censé savoir qu'il existe une séquence, et tu n'es pas censé pouvoir l'appeler.
    En faisant le trigger, il suffit dans ta requête insert de ne pas passer de clé primaire, et elle sera générée automatiquement.

Discussions similaires

  1. Problème sur génération de clé primaire
    Par trouffiondesiles dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/11/2009, 21h01
  2. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03
  3. [Interbase 7] Problème d'insertion de données
    Par Tuscelan dans le forum InterBase
    Réponses: 12
    Dernier message: 19/11/2003, 22h58
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

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