2009-05-11 10 views
1

J'ai une petite question pour vous gourous SQL. J'ai des tables existantes sans colonne de clé primaire et l'identité n'est pas définie. Maintenant j'essaye de modifier ces tables en faisant la colonne entière existante comme clef primaire et en ajoutant des valeurs d'identité pour cette colonne. Ma question est que je dois d'abord copier tous les enregistrements de la table à une table temporaire avant de faire ces changements. Est-ce que je perds tous les enregistrements précédents si j'ai couru la commande T-SQL pour faire la clé primaire et ajouter la colonne d'identité sur ces tables. Quelles sont les approches que je devrais prendre telles queCréation d'une clé primaire et d'une colonne d'identité après le chargement des données

1) Créer une table temporaire pour copier tous les enregistrements de la table à modifier 2) Charger tous les enregistrements à la temptable 3) Apporter des modifications sur le schéma de la table 4) Chargez enfin les enregistrements de la table temporaire dans la table d'origine.

Ou

il ya de meilleurs moyens que cela? Je vous remercie de votre aide

Merci

Répondre

3

Espérons que vous n'avez pas trop d'enregistrements dans la table. Que se passe-t-il si vous utilisez Management Studio pour modifier un champ existant en identité, c'est qu'il crée une autre table avec le jeu de champs d'identité. il active l'insertion d'identité et insère les enregistrements de la table d'origine, puis désactive l'insertion d'identité. Ensuite, il supprime l'ancienne table et renomme la table qu'il vient de créer. Cela peut être un processus assez long si vous avez beaucoup d'enregistrements. Si c'est le cas, je l'écrirais et je le ferais dans un travail qui se déroule pendant les heures creuses, car la table sera complètement verrouillée pendant que vous faites cela.

+0

Merci j'ai vraiment aimé votre réponse. – Shiva

0

Si votre colonne entière existant est unique et approprié, il devrait y avoir aucun problème à la conversion d'un PK. Une autre alternative, si vous ne voulez pas utiliser la colonne existante, vous pouvez ajouter une nouvelle colonne PK à la table principale, la peupler et la graine, puis exécuter des instructions update pour mettre à jour toutes les autres tables avec PK. Quelle que soit la façon dont vous le faites, assurez-vous de faire d'abord une sauvegarde!

2

suffit de faire tous vos changements dans le studio de gestion, copiez/collez le script généré dans un fichier. NE PAS ENREGISTRER LES CHANGEMENTS à ce stade. Regardez et modifiez ce script si nécessaire, il fera probablement exactement ce que vous pensez (il supprimera la table d'origine et renommera la temp au nom de l'original), mais gérera toutes les contraintes et tous les FK.

+0

une autre astuce supplémentaire, qui aide à créer un script pour l'exécuter à la nuit .. merci –

4

Outils> Options> Concepteurs> Tableau et Base de données concepteurs

Décochez la case « Empêcher l'enregistrement des modifications qui nécessitent la recréation de table »

[Modifier] J'ai essayé avec tables peuplées et je ne perdre des données, mais je ne sais pas vraiment à ce sujet.

+0

Merci pour le conseil ...il m'a sauvé du temps doind la requête :) –

0

Vous pouvez toujours ajouter la colonne IDENTITY après avoir copié vos données. Vous pouvez également réinitialiser la graine IDENTITY à l'entier maximum + 1. Cela devrait résoudre vos problèmes.

DBCC CHECKIDENT ('MyTable', RESEED, n)

Où n est le numéro que vous voulez l'identité pour commencer à.