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

DB2 Discussion :

DB2/400 Auto incrément


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 396
    Par défaut DB2/400 Auto incrément
    Bonjour à tous

    Le sujet a déjà été abordé mais je n'ai pas trouvé la réponse dans le forum

    J'utilise des auto-incréments déclarés avec GENERATED BY DEFAULT AS IDENTITY
    ça fonctionne très bien
    J'ai choisis le BY DEFAULT plutôt que le ALWAYS car j'ai besoin de restaurer des données (dans d'autre bib, pour tets, sauvegardes ...) et j'ai un outil qui me génère le script de sauvegarde avec des INSERT (pour toutes les zones)

    Je peux donc réintégrer mes données de cette manière après avoir recréé la structure des tables. Le problème c'est qu'après avoir remonté mon script l'insert suivant ne prend pas en compte le dernier ID ajouté mais essaye de repartir à 1.
    Peut-t'on forcer la valeur du prochain ID Auto (le START ?), ou spécifier à la création qu'on doit prendre en compte les ID ajoutés manuellement

    Exemple :

    1) Je créé la table

    2) J'insère des données par script :
    INSERT INTO t1 (c1 , c2) VALUES (1, '')
    INSERT INTO t1 (c1, c2) VALUES (2, '')
    INSERT INTO t1 (c1, c2) VALUES (3, '')

    3) Je veux maintenant réutiliser l'auto-incrément :
    INSERT INTO t1 (c2) VALUES ('')

    et là ça plante, car il essaye d'insérer (1, '')

    J'espère avoir été essez clair
    Merci de votre aide

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO T1 (c1, c2) VALUES( IDENTITY_VAL_LOCAL()+1, ' ' )
    IDENTITY_VAL_LOCAL() est une fonction qui renvoie la valeur la plus récente assignée à une colonne identitaire.

    Si par exemple la dernière valeur assignée automatiquement ou manuellement à la colonne identitaire est 2, cette fonction renverra la valeur 2.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE t1 ALTER COLUMN c1 RESTART WITH 4;
    INSERT INTO T1 (c2) VALUES(' ' )

  4. #4
    Membre Expert
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 396
    Par défaut
    Mercure : merci mais ça ne modifie pas le prochain auto-incrément, on reste toujours dans le cas où on force la valeur. De plus il faut faire ça juste après car IDENTITY_VAL_LOCAL() retourne le dernier ID auto qu'elle que soit la table.

    K2R400 : C'est exactement ça que je cherchais, je viens d'ailleurs de tomber dessus dans un pdf ibm. Merci
    L'idéal aurait été d'associer ça avec un Max mais ce n'est pas possible

    Un truc de ce genre aurait été parfait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE <table> ALTER COLUMN <colonne> RESTART WITH (SELECT MAX(<id_table>) FROM <table>)+1)
    Mais là j'en demande un peu trop ...

    Merci à tous les deux

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    J'ai pas dû alors bien comprendre la question posée initalement car j'ai cru comprendre que tout se faisait au cours du même job...

  6. #6
    Membre Expert
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 396
    Par défaut
    Oui effectivement, en me relisant j'aurais compris comme toi
    En fait il peut y avoir beaucoup de temps entre 2) et 3)
    2) est une restauration de données, 3) c'est l'utilisation au quotidien de l'application

    J'ai ajouté un traitement dans mon application pour remettre à jour les ID concernés juste après l'intégration d'un script

    Bonne soirée

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

Discussions similaires

  1. Pb d'auto incrémentation sous interbase !!!
    Par le.clown dans le forum InterBase
    Réponses: 2
    Dernier message: 26/02/2004, 14h11
  2. prbl auto-incrémente
    Par cb dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/11/2003, 11h32
  3. Dernière clé auto incrémenté ?
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 15/11/2003, 10h41
  4. [CODE] auto incrémentation ?
    Par Roi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/09/2003, 15h09
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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