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 :

auto-increment sans séquences ?


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
    Mars 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut auto-increment sans séquences ?
    Bonjour,
    j'ai fais une séquence pour une valaur auto-incerment, de la façon qu'on trouve partout sur le web, une séquence, un trigger before insert et un select next.val.
    (je ne suis pas un expert).

    Mais pour une raison qui m'échappe, la séquence ne s'incrémente pas toujours et lorsque je veux insérer un élément, j'ai un doublon.
    Je n'ai malheureusement pas la requête précise ici.
    Si vous avez une idée d'ou cela peut venir, je suis preneur..

    Par contre, est-il possible de contrer cela avec une fonction qui ferait un

    select max(monid)+1 into monid ?
    Et si oui, comment faire pour que ca reprenne toutes les valeurs que l'on désire insérer, c'est ca que je ne visualise pas.
    avec les :old. et :new. pour chacun des champs dans un trigger before insert ??


    Merci pr votre aide.

  2. #2
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Salut Fritzoune,

    Est-ce que tu pourrais nous mettre un exemple aussi simpliste que possible qui démontre que la séquence ne s'incrémente pas??

    Une séquence dans Oracle s'incrémente vraiment dès qu'on fait appel à NEXTVAL; même si la requête dans laquelle tu fais cet appel échoue.

    Par exemple:

    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
     
    CREATE SEQUENCE SEQ_FRITZ 
       START WITH 1 INCREMENT BY 1 
       MINVALUE 1 NOMAXVALUE 
       NOCYCLE;
     
    CREATE TABLE TBL_FRITZ (
       INC_COL NUMBER(10) NOT NULL, 
       UNIQ_COL VARCHAR2(10) UNIQUE
    );
     
    INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'Hello');//11g
    INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'le');
    INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'monde');
     
    SELECT SEQ_FRITZ.CURRVAL FROM DUAL;
     
    INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'Hello');
    INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'le');
    INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'monde');
     
    SELECT SEQ_FRITZ.CURRVAL FROM DUAL;
    Donc, dans cet exemple, les 3 derniers INSERTS ne fonctionneront pas (à cause de la contrainte UNIQUE), mais incrémenterons la séquence.


    Ceci dit, si cela ne te convient pas, pourquoi pas simplement un


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO TBL_FRITZ VALUES( 
        (SELECT MAX(INC_COL) + 1 FROM TBL_FRITZ), 
        'Hello ' || (SELECT MAX(INC_COL) + 1 FROM TBL_FRITZ)
    );
    Mais, j'avoue que je suis curieux de savoir pourquoi ta séquence ne s'incrémente pas...

    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut
    J'ai meme le paramètre nocache pour la cération de la séquence.
    J'aurais plus de détails dès que je retourne chez le client chez qui ca fait ça.
    Mais c'est également la 1ère fois que je vois ca..

    Faut encore que je vois comment fait le client, car comme tu dis j'ai testé avec des select masequence.nextval, et elle s'incrémente..
    Mais la colonne n'avait pas de contrainte unique et donc pafois les N° étaient soit à double, soit à 0 ( ce n'est pas une colonne clé). De plus le cache était à20 et j'ai vu pas mal de saut de 20 en 20,donc c'est un peu comme si y a eu des rollback lors de l'insertion non ? je ne suis pas trop au clair.
    La j'ai rajouté la contrainte unique et oracle me renvoie l'erreur comme quoi l'élément n'est pas unique.

    Je sais pas si comme il a plusieurs trigger sur la table, before insert, after insert, before update, cela peut influencer et le système se mélange ?



    Merci pour la syntaxe de la 2ème requête
    jvais essayer d'appter ça avec un :new

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Salut Fritzoune,

    Si je peux me permettre... Le cache est stocké dans la SGA et donc n'est pas "perdu" au ROLLBACK mais lorsque la base de données est arrêtée.

    Tu peux tester, tu verras que même après le ROLLBACK, la valeur de la séquence ne passe pas à la vingtaine suivante

    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
     
    ALTER SEQUENCE SEQ_FRITZ CACHE 20;
     
    SELECT CONSTRAINT_NAME
      FROM USER_CONSTRAINTS
     WHERE TABLE_NAME = 'TBL_FRITZ'
       AND CONSTRAINT_TYPE = 'U';
     
    ALTER TABLE TBL_FRITZ DROP CONSTRAINT SYS_C0011232;
     
    SELECT SEQ_FRITZ.NEXTVAL FROM DUAL;
     
      INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'Hello'); --
      INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'Hello'); --
      INSERT INTO TBL_FRITZ VALUES(SEQ_FRITZ.NEXTVAL, 'Hello'); --
     
    ROLLBACK;
     
    SELECT SEQ_FRITZ.NEXTVAL FROM DUAL;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 98
    Par défaut
    Bon on a enfin trouver ce qu'il n'allait pas.

    Il avait des séquences avec le même nom (base test) dans un schéma différent et en fait le trigger exécutait les 2 séquences en même temps et prenait 1 des 2 valeurs de retour...


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

Discussions similaires

  1. colonne en auto-increment sans trigger ?
    Par doc malkovich dans le forum SQL
    Réponses: 1
    Dernier message: 27/05/2010, 10h33
  2. [MYSQL] valeur auto-increment
    Par alex1er dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/07/2003, 12h26
  3. Auto Increment
    Par Guizz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/06/2003, 18h36
  4. Nom du champs auto-incrementé
    Par norroy dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 18h30
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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