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 :

Load d'une table avec une colonne auto incrémentée


Sujet :

DB2

  1. #1
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut Load d'une table avec une colonne auto incrémentée
    Bonjour les forumnautes...

    J'ai une question : Lors d'un load de table comportant une colonne qui s'auto incrémente (type : ColonneA DECIMAL(0008) GENERATED ALWAYS AS IDENTITY) le load re-incrémente t'il la colonne (de 000001 à 999999 sans laisser de trous) où bien conserve t'il les données de la table sans ré-incrémenter (laissant ainsi les 'trous' que peut générer ce type de colonne... exemple 0000001,000002, 0000015,0000016, 0000018 etc ...)

    Merci pour vos réponses

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 38
    Points
    38
    Par défaut
    un load ne ré-incremente pas la colonne sauf si dans ta commande de load tu ajoutes "modified by identitymissing" en LUW même chose sur Z ?

    mais attention aux contraintes d'intégrités si il y en a ....

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 38
    Points
    38
    Par défaut
    j'ajouterais aussi qu'il faut faire attention à la "start value" de ce champ. si la table est crée avec un "start" à 1 alors la prochaine numérotation c'est 1 , 2 etc ...

    et pas 99999999 si ta dernière valeur est celle ci... donc -803 en perspective....

    Le load avec la clause identitymissing va ré-incrémenter à partir de la valeur du "start"

  4. #4
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Merci pour ta réponse...

  5. #5
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Pour moi et en DB2 z/OS une colonne GENERATED ALWAYS AS IDENTITY est toujours déterminée par DB2 ...

    ALWAYS
    Specifies that DB2 will always generate a value for the column when a row is inserted into the table. ALWAYS is the recommended value unless you are using data propagation
    Source :
    CREATE TABLE

    Donc le LOAD va recalculer cette colonne ...

  6. #6
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Re-bonjour...
    Je crains que vous ayez raison Luc, car le 'LOAD, et mes tests en font foi, re-incrémente ma colonne...
    Wlassout : Pouvez-vous m'envoyer la syntaxe d'un load avec la valeur : 'modified by identitymissing' car, je n'arrive pas à le faire fonctionner...

    Merci d'avance

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 38
    Points
    38
    Par défaut
    désolé de vous contredire mais un load standard ne ré-incrémente pas un colonne identity.

    si dans vos test vous faites un max de la colonne il y aura la valeur certainement la plus élevée avant l'unload mais lors du première insert il y aura clé en double sauf si la start value est plus elevé que ce fameux max.

    ou alors ce n'est pas un load mais in import (insert) qui est effectué ?

    pour le load en UDB, qui devrait marcher avec un DB2 Z/OS si on le lance depuis un client il faudrait faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    load client from mon_fichier of type_fichier modified by identitymissing  insert into ma_table
    ça doit à peu pres etre ça .....

  8. #8
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Merci pour votre réponse...
    Je crois que nous ne parlons pas du même LOAD...
    Ma question, et j'aurais dû en faire part tout de suite, se posait sur un LOAD Z/OS... et, comme mes test me l'on démontré, le LOAD ré-incrémente les valeurs de la colonne identity...
    Et, comme Luc l'a dit, je ne crois pas (la doc DB2 Z/OS semble le confirmer) qu'il y ait un LOAD Z/OS qui ne re-incrémente pas la donnée auto-incrémentable...
    Wlassout, vous parlez d'un LOAD UDB... car la valeur 'modified by identitymissing' n'est pas admise dans un LOAD Z/OS...

    Merci encore pour vos éclaircissements...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 38
    Points
    38
    Par défaut
    J'ai beaucoup travaillé sur des DB2 Z/OS et je rouille ...


    je me souviens effectivement que si la colonne est en generate always elle est réincrementée, alors qu'en generate by default ce n'est pas le cas !

    d'où une petite méfiance à avoir avec le generate always et les clés primaires ...

  10. #10
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    Non plus...
    Colonne avec ALWAYS => La colonne se load avec la dernière occurence de la colonne, d'avant le load...
    Colonne avec 'BY DEFAULT' => La colonne loadé recommence à 000001...

    Néanmoins, je vous remercie pour votre disponibilité ...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 38
    Points
    38
    Par défaut
    ben voila trop rouillé je disais

  12. #12
    Membre habitué
    Homme Profil pro
    CMA-CGM
    Inscrit en
    Novembre 2005
    Messages
    531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : CMA-CGM
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2005
    Messages : 531
    Points : 137
    Points
    137
    Par défaut
    ERRATUM...
    Il est parfaitement possible d'effectuer un LOAD d'une table en gardant les identity de la table source...
    Il suffit de rajouter IDENTITYOVVERIDE et de coder en dur, dans le load, le nom de la Rubrique_identity :
    LOAD DATA LOG NO RESUME YES IDENTITYOVERRIDE
    INDDN SYSREC00 INTO TABLE
    toto.VINCENTB
    (
    Rubrique_identity POSITION( 1: 5)
    DECIMAL ,
    etc...

    Mais il semblerait que cela implique d'autres problèmes du type :
    1°) J'effectue un drop/dcreate de la table cible...
    2°) Je loade ma table cible (avec IDENTITYOVERRIDE) avec les enregs quivants de ma table source :
    000001 toto
    000005 titi
    000006 tutu
    (00000n étant la rubrique identity !)

    Ma table cible qui se retrouve donc avec les 3 enreg suivants :
    000001 toto
    000005 titi
    000006 tutu

    OK =>

    Mais

    au prochain insert de la table cible, l'identity de la table cible va reprendre au numéro 00001...

    Ce qui veut dire que IDENTIYOVERRIDE ne remet pas à jour le compteur de la table cible... il se contente juste d'overrider les identity de la table ...

    ERRATUM aussi pour mon message suivant :
    Non plus...
    Colonne avec ALWAYS => La colonne se load avec la dernière occurence de la colonne, d'avant le load...
    Colonne avec 'BY DEFAULT' => La colonne loadé recommence à 000001...
    Il ne faut pas le prendre en compte !

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 42
    Points : 44
    Points
    44
    Par défaut
    Salut, on parle bien de DB2 V8 pour Z/OS ?
    Parce que de mon côté impossible de recharger sur des champs IDENTITY définis en
    GENERATE ALWAYS AS IDENTITY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DSNU323I  -DB2O DSNURWUF - COLUMN 'IDENTITY' IS OMITTED
    Par contre sur des champs IDENTITY définis en
    GENERATE BY DEFAULT AS IDENTITY
    le LOAD dans une nouvelle table ou dans la table existante (LOAD REPLACE), recalcule les ROWID indépendamment du paramètre IDENTITYOVERRIDE.

    Voici la syspunch utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LOAD DATA INDDN SYSREC   LOG YES REPLACE IDENTITYOVERRIDE      
     EBCDIC  CCSID(01147,00000,00000)                              
     INTO TABLE "DV02U"."JRLIDEN3"                                 
     WHEN(00001:00002) = X'42E3'                                   
     IGNOREFIELDS YES                                              
     ( "LIBELLE"                                                   
            POSITION(  00003:00012) CHAR(00010)                    
     , "DSN_IDENTITY"                                              
            POSITION(  00013:00016) INTEGER                        
     )

  14. #14
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par genio Voir le message
    ERRATUM...
    Il est parfaitement possible d'effectuer un LOAD d'une table en gardant les identity de la table source...
    Il suffit de rajouter IDENTITYOVVERIDE et de coder en dur, dans le load, le nom de la Rubrique_identity ...
    Bien vu ... Il s'agit d'une correction PTF issue d'un APAR même applicable en V7 mais plus sûrement utilisable en V8 ( option décrite dans le doc V8 ) :
    PK27287

    Par contre, ça ne semble fonctionner que pour une colonne IDENTITY en GENERATED ALWAYS ...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 42
    Points : 44
    Points
    44
    Par défaut
    Effectivement J'avais oublié de modifier le nom de la colonne IDENTITY de la syspunch. J'ai remplacé le DSN_IDENTITY par le vrai nom et oui ca marche.
    Désolé.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 42
    Points : 44
    Points
    44
    Par défaut
    Et par contre quand on recharge sur la même table, le champ IDENTITY est incrémenté ensuite avec la valeur directement supérieure au dernier ROWID attribué.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2015, 16h10
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  3. [MySQL] requete dans une table avec une varible d'une autre table
    Par kogoi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/11/2011, 15h24
  4. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  5. Réponses: 6
    Dernier message: 30/08/2007, 16h47

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