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 :

Ajouter une clé de type auto-increment


Sujet :

SQL Oracle

  1. #1
    Provisoirement toléré
    Inscrit en
    Novembre 2006
    Messages
    630
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 630
    Points : 125
    Points
    125
    Par défaut Ajouter une clé de type auto-increment
    salut

    je cherche à utiliser une clé auto incrémenté pour faire l'insertion des enregistrement dans la table et voila ce que j'ai trouvé sur le forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    CREATE sequence seq_article ; 
    CREATE OR REPLACE TRIGGER ti_article 
    BEFORE INSERT
    ON tb_article
    REFERENCING OLD AS OLD NEW AS NEW
    FOR EACH ROW
    BEGIN
        SELECT seq_article.NEXTVAL INTO :NEW.pk_article FROM dual;
    END;
    /

    mais je n'ai pas bien compris ce deux ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    REFERENCING OLD AS OLD NEW AS NEW
    SELECT seq_article.NEXTVAL INTO :NEW.pk_article FROM dual;
    et comment faire appele cette procedure

    j'aiune table personne qui contient deux chams nom et prenom
    comment j'utilise pour faire inseret des valeurs avec un champs incrémenté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO personne  (nom,prenom) VALUES('Marc','Muller')
    merci de bien m'aider

  2. #2
    Membre chevronné
    Profil pro
    MOA
    Inscrit en
    Décembre 2002
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : MOA

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 013
    Points : 1 763
    Points
    1 763
    Par défaut
    pas besoin d'utiliser un trigger.


    suffit de creer une sequence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE sequence seq_personne ;

    puis apres lors de l'insertion de tes données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO personne  (personne_id,nom,prenom) VALUES(seq_personne.NEXTVAL, 'Marc','Muller');

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par ulysse031 Voir le message
    ...

    mais je n'ai pas bien compris ce deux ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    REFERENCING OLD AS OLD NEW AS NEW
    SELECT seq_article.NEXTVAL INTO :NEW.pk_article FROM dual;
    Le REFERENCING ne sert manifestement à rien. J'utilise habituellement ce trigger, et c'est la première fois que je vois cette clause.

    Quant au SELECT... INTO, il place la prochaine valeur de la séquence dans la clé primaire de la table tb_article.

    Citation Envoyé par ulysse031 Voir le message
    ...
    et comment faire appele cette procedure
    C'est précisément l'intérêt du trigger par rapport à la solution de weed : tu n'as pas besoin d'y faire appel. Il se déclenche automatiquement à chaque insertion sur la table
    Citation Envoyé par ulysse031 Voir le message
    ...

    j'aiune table personne qui contient deux chams nom et prenom
    comment j'utilise pour faire inseret des valeurs avec un champs incrémenté

    merci de bien m'aider
    Tu commences par créer une colonne pour recevoir le numéro auto-incrémenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE personne 
    ADD COLUMN IDpersonne INTEGER NOT NULL PRIMARY KEY ;
    (je ne réponds pas de ma syntaxe Oracle à 3 heures du mat', mais l'idée est là )

    Ensuite, tu crées la séquence et le trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE sequence seq_personne; 
    CREATE OR REPLACE TRIGGER ti_personne 
    BEFORE INSERT ON personne
    FOR EACH ROW
    BEGIN
        SELECT seq_personne.NEXTVAL INTO :NEW.IDpersonne FROM dual;
    END;
    Tu peux ensuite faire ton insertion sans t'occuper du numéro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO personne  (nom,prenom) VALUES('Marc','Muller')
    et tu verras qu'il s'ajoute tout seul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personne ;
    (au passage, tu as inversé nom et prénom dans ton exemple)
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par Antoun Voir le message
    C'est précisément l'intérêt du trigger par rapport à la solution de weed : tu n'as pas besoin d'y faire appel. Il se déclenche automatiquement à chaque insertion sur la table
    Si je ne m'abuse, ce n'est pas exactement ça. En fait, il met la valeur de la séquence.nextVal dans le champ concerné lorsque celui-ci "IS NULL".

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par madevilts Voir le message
    Si je ne m'abuse, ce n'est pas exactement ça. En fait, il met la valeur de la séquence.nextVal dans le champ concerné lorsque celui-ci "IS NULL".
    pas forcément
    le referencing(dans le cas où on aurait besoin) est utilisé dans les triggers sur lignes pour manipuler les valeurs avant et après exécution du trigger.
    referencing a as old b as new
    a.champ ancienne valeur
    b.champ nouvelle valeur

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    On peut s'en passer du trigger :


    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
    45
    46
    47
    48
     
    SQL> create table personne ( nom varchar2(30), prenom varchar2(30));
     
    Table created.
     
    SQL> ALTER TABLE personne
      2  ADD  IDpersonne INTEGER NOT NULL PRIMARY KEY -- sans COLUMN 
      3  ;
     
    Table altered.
     
    SQL> CREATE sequence seq_personne start WITH 1 increment BY 1 nocycle 
      2  nocache; 
     
    Sequence created.
     
    SQL> INSERT INTO personne  (IDpersonne,nom,prenom)
      2          VALUES (seq_personne.NEXTVAL,'Marc','Muller');
     
    1 row created.
     
    SQL> SELECT * FROM personne;
     
    NOM                            PRENOM                         IDPERSONNE
    ------------------------------ ------------------------------ ----------
    Marc                           Muller                                  1
     
    SQL> commit;
     
    Commit complete.
     
    SQL> INSERT INTO personne  (IDpersonne,nom,prenom) 
      2          VALUES(seq_personne.NEXTVAL,'Marc2','Muller2');
     
    1 row created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> SELECT * FROM personne;
     
    NOM                            PRENOM                         IDPERSONNE
    ------------------------------ ------------------------------ ----------
    Marc                           Muller                                  1
    Marc2                          Muller2                                 2
     
    SQL>

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    @salim11 : On sait qu'on peut se passer du trigger, c'est déjà la solution qu'a donné weed qq posts plus haut. L'intérêt du trigger est qu'ensuite l'utilisateur a juste à faire sa requête d'insertion sans s'occuper de la séquence (c'est le fonctionnement des autres SGBD, par ex. SQL Server avec IDENTIFY ou MySQL avec AUTO_INCREMENT).

    @madevilts : je ne vois pas bien où est la condition IS NULL ?

    @messalux : OK, mais je ne vois toujours pas ce que change "OLD AS OLD" et "NEW AS NEW"
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Au temps pour moi, en fait, la syntaxe de création de mes triggers inclus cette condition je n'avais pas fait gaffe car j'en fais un copier / coller a chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace TRIGGER "XXX"."DOSSIER_TRG"
    before insert on "DOSSIER"
      for each row begin
        if inserting then
          if :NEW."DOS_NUMERO" is null then
            select DOSSIER_SEQ.nextval into :NEW."DOS_NUMERO" from dual;
          end if;
        end if;
      end;

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    @madevilts : au passage, tu pourrais éviter le IF avec un NVL (ou un COALESCE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT NVL(:NEW."DOS_NUMERO" , DOSSIER_SEQ.NEXTVAL) INTO :NEW."DOS_NUMERO" 
    FROM dual;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par Antoun Voir le message
    @madevilts : au passage, tu pourrais éviter le IF avec un NVL (ou un COALESCE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT NVL(:NEW."DOS_NUMERO" , DOSSIER_SEQ.NEXTVAL) INTO :NEW."DOS_NUMERO" 
    FROM dual;
    Merci, je ne connaissais pas

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    je suis pour une solutiion trigger. ça permet d'automatiser l'insertion que ce soit niveau sqlplus, forms, et autres...

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

Discussions similaires

  1. ajouter une colonne de type ATTACHMENT FIELD à une bibliothèque de document
    Par chrisade dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 19/11/2009, 11h55
  2. Réponses: 3
    Dernier message: 13/10/2009, 12h32
  3. Ajouter une heure à un type date
    Par SuperPat dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/07/2008, 09h35
  4. Réponses: 1
    Dernier message: 25/09/2006, 10h18
  5. colonnes de type auto incremental
    Par Bill_Baroud dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/12/2004, 12h28

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