2010-11-23 48 views
0

Dans Pentaho Kettle, disons que l'on veut copier des données entre deux tables identiques, A et B. S'il y a une colonne qui est incrémentée automatiquement, il y a un moyen de conserver la valeur de cette colonne copier les données de A à B? Est-ce que le comportement de la base de données automatique des colonnes incrémentées est spécifique ou est-ce que Kettle a trouvé une solution générale pour cela?Préserver les colonnes incrémentées automatiques dans Pentaho Kettle

Répondre

1

Si vous avez deux tables, définies de manière identique pour leurs colonnes, et qu'une colonne auto-incrémentée figure dans les deux tables, puis que vous remplissez l'une des tables avec des données, vous incrémentez le nombre dans le tableau 1. Maintenant, afin d'insérer ces lignes dans la table miroir, vous devrez les extraire de la première table dans le même ordre que celui dans lequel elles ont été insérées, afin qu'elles puissent être insérées dans la table miroir dans le même ordre. Alors, et seulement alors, les nombres auto-incrémentés empanneraient. Cela dit, cela serait considéré comme une conception fragile.

L'alternative serait de rendre les tables identiques en ce qui concerne les types de données de colonne, mais pas de colonne auto-incrémentée dans la table miroir. Faites simplement de cette colonne de la table miroir un entier, sans possibilité d'auto-incrémentation.

1

La réponse de Tim est raisonnable. Normalement, je ferais la même chose: Rendre la table B identique à la table A, sauf que la table PK ne soit pas une colonne auto-incrémentée. (Essayer de toujours insérer les données dans le même ordre serait une mauvaise idée, ce serait certainement fragile, comme Tim l'a mentionné.) Mais en réalité, ce serait pire que ça: d'abord, vous ne pouviez pas faire d'encarts en masse. Vous devez valider chaque ligne individuellement, et vous ne pouvez pas être certain que la prochaine valeur utilisée sera l'entier suivant.C'est la responsabilité du SGBD de choisir la prochaine valeur.Il y a beaucoup de situations où la prochaine valeur insérée ne sera pas l'entier supérieur suivant.)

Mais un détail important est que les SGBD gèrent différemment les champs auto-incrémentés. Dans de nombreux cas, le comportement du champ auto-incrémenté est de fournir une valeur si la valeur insérée est NULL mais d'accepter une valeur explicite si une valeur est fournie. Dans d'autres cas, la base de données rejettera les tentatives d'insertion d'une valeur dans un champ auto-incrémenté.

Donc, si vous faites face au premier cas, ce n'est vraiment pas un problème de laisser la table A et la table B complètement identiques. Votre travail ETL va insérer des valeurs dans la table B, et la nature auto-incrémentée de la colonne PK sera juste ignorée.