TSQL: UPDATE avec INSERT INTO SELECT FROM
donc, j'ai une ancienne base de données que je suis migration vers un nouveau. La nouvelle a un peu différente, mais surtout compatible avec le schéma. En outre, je tiens à renuméroter toutes les tables à partir de zéro.
Actuellement, j'ai été en utilisant un outil que j'ai écrit à la main récupère l'ancien record, qui l'insère dans la nouvelle base de données, et les mises à jour v2 champ ID dans l'ancienne base de données à afficher son identité correspondante lieu dans la nouvelle base de données.
par exemple, je suis de la sélection de MV5.Des postes et de l'insertion dans MV6.Les postes. Lors de l'insertion, j'ai récupérer l'ID de la ligne nouvelle dans MV6.Les postes et les mettre à jour dans la vieille MV5.Les postes.MV6ID champ.
Est-il un moyen de faire cette mise à JOUR via un INSERT EN SÉLECTIONNER à PARTIR donc je n'ai pas de traiter tous les enregistrements manuellement? Je suis à l'aide de SQL Server 2005, dev edition.
source d'informationauteur tsilb | 2009-04-12
Vous devez vous connecter pour publier un commentaire.
La clé de la migration est de faire plusieurs choses:
Tout d'abord, ne pas faire n'importe quoi sans une sauvegarde à jour.
Deuxièmement, si les clés de changement, vous avez besoin pour stocker à la fois l'ancien et le nouveau dans la nouvelle structure, au moins temporairement (de façon Permanente si le champ clé est exposée pour les utilisateurs, car ils peuvent être à la recherche par pour obtenir des enregistrements anciens).
Ensuite, vous devez avoir une compréhension approfondie de la relation à l'enfant des tables. Si vous modifiez le champ de la clé de toutes les tables associées doivent changer aussi. C'est là qu'avoir à la fois ancienne et de la nouvelle clé stockée est très pratique. Si vous avez oublié de changer l'un d'eux, les données ne seront plus correct et sera inutile. C'est donc une étape cruciale.
Choisir quelques cas de test est particulièrement complexe de données assurez-vous d'inclure un ou plusieurs des cas de test pour chaque table liée. Stocker les valeurs dans les tables de travail.
De commencer la migration, vous insérez dans la nouvelle table à l'aide d'une sélection à partir de l'ancienne table. En fonction de la quantité de dossiers, vous pouvez faire une boucle par lots (pas un seul enregistrement à la fois) pour améliorer les performances. Si la nouvelle clé est une identité, il vous suffit de mettre la valeur de l'ancienne clé dans son domaine et de laisser la base de données créer les nouvelles clés.
Puis faites de même avec les tables liées. Puis utiliser l'ancienne valeur de clé dans la table à mettre à jour les champs de clé étrangère avec quelque chose comme:
Test de la migration par l'exécution du cas de test et de comparer les données avec ce que vous avez stocké avant la migration. Il est absolument essentiel de tester la migration de données ou vous ne pouvez pas être sûr que les données sont cohérentes avec l'ancienne structure. La Migration est une action très complexe; il paye pour prendre votre temps et de le faire très méthodiquement et minutieusement.
Probablement la façon la plus simple serait d'ajouter une colonne sur MV6.Les postes pour l'oldId, puis insérez tous les enregistrements de la table ancienne dans la nouvelle table. Dernier, la mise à jour de l'ancienne table de correspondance sur oldId dans la nouvelle table avec quelque chose comme:
Vous pourriez nettoyer et de les déposer à l'oldId colonne par la suite, si vous vouliez.
Le meilleur que vous pouvez faire que je sais, c'est avec le sortie de la clause. En supposant que vous avez SQL 2005 ou 2008.
Il ne serait toujours besoin d'un second passage à la mise à jour de la table d'origine; toutefois, il peut aider à rendre votre logique simple. Avez-vous besoin de mettre à jour la table source? Vous pouvez simplement enregistrer la nouvelle id dans une troisième croix de la table de référence.
Heh. Je me souviens de faire cela d'une migration.
Mettre le old_id dans la nouvelle table est à la fois la mise à jour plus facile-vous pouvez juste faire un
insert into newtable select ... from oldtable
-- et la suite "couture", de documents plus facile. Dans le "point", vous allez vous mettre à jour l'enfant des tables de clés étrangères dans l'insert, en faisant une sous-sélection sur le nouveau parent (insert into newchild select ... (select id from new_parent where old_id = oldchild.fk) as fk, ... from oldchild
) ou vous pouvez insérer des enfants et effectuer une mise à jour pour corriger les clés étrangères.De le faire dans un insert est plus rapide; le faire dans une étape distincte ame qui les semelles ne sont pas d'ordre à charge, et peut être re-fait si nécessaire.
Après la migration, vous pouvez soit laisser tomber le
old_id
colonnes, ou, si vous avez un cas où le système d'héritage exposés les id de sorte que les usagers utilisé les clés de données, vous pouvez les garder pour permettre l'utilisation de recherche basé sur la old_id.En effet, si vous avez les clés étrangères correctement définis, vous pouvez utiliser systables/information-schéma de générer votre insert.
Puisque vous ne voulez pas le faire manuellementmais automatiquementcréer un déclencheur sur
MV6.Posts
de sorte queUPDATE
se produit surMV5.Posts
automatiquement lorsque vous insérez dansMV6.Posts
.Et votre déclencheur pourrait ressembler à quelque chose comme,
Autant que je sache, vous ne pouvez pas mettre à jour deux tables différentes avec une seule instruction sql
Vous pouvez toutefois utiliser des déclencheurs d'obtenir ce que vous voulez faire.
Faire une colonne dans MV6.Post.OldMV5Id
faire un
insérez dans MV6.Post
sélectionnez .. à partir de MV5.Post
puis faire une mise à jour de MV5.Post.MV6ID