2010-12-02 8 views
2

Je suis en train de "nettoyer" une base de données et j'ai besoin de synchroniser les colonnes IDENTITY. J'utilise des procédures stockées pour gérer les données et les mettre en miroir d'une table à l'autre (après le nettoyage et la correction des types de données). À un moment donné dans le futur, je vais vouloir couper l'ancienne table et utiliser uniquement la nouvelle table, ma question est comment faire pour que le champ IDENTITY reste synchronisé pendant qu'ils sont tous les deux utilisés ... Une fois l'ancienne table retirée nouveau doit continuer à auto-incrémentation et la reconstruction/modification pour changer le champ IDENTITY n'est pas une option. Est-ce possible ou existe-t-il une meilleure façon de s'y prendre? Mon autre pensée était de créer une table de recherche pour stocker les colonnes ID des deux tables et chaque fois qu'il y a un insert dans la nouvelle table prendre l'ancien ID et nouvel ID et les insérer dans la table de recherche. C'est un peu désordonné une fois que la vieille table est à l'écart.Plusieurs tables SQL avec colonnes IDENTITY synchronisées

Répondre

1
  1. Définissez l'identité de la nouvelle table comme zone de non-identité.
  2. Modifiez vos procédures de remplissage de données pour remplir le champ de non-identité de votre nouvelle table avec la valeur d'identité de l'ancienne table.
  3. Lors de la transition, passez votre nouveau champ à l'auto-incrémentation et set the seed number en conséquence.
+0

La modification d'un champ de non-identité en identité nécessite-t-elle une reconstruction de la table? – jon3laze

+0

Quel serveur SQL utilisez-vous? Pour MS SQL, non. Ajout du lien ci-dessus à l'article MSDN pertinent –

+0

Oui MSSQL. Merci pour l'article. – jon3laze

3

Été là, fait cela. Mettez l'ancien ID dans la nouvelle table en tant que FK. Déposez cette colonne juste avant de déposer l'ancienne table.

+0

J'aime cette idée (+1). Donc, avant d'utiliser votre table NEWR, changez le type en un champ d'identité? –

+0

+1 J'aime cette idée, mais j'ai oublié de mentionner qu'il y aurait des enregistrements ajoutés à la nouvelle table qui ne seraient pas dans l'ancienne table. Ma solution est de changer le champ ID de la nouvelle table en un champ de non-identité et de mettre un déclencheur sur l'ancienne table pour remplir le nouveau. Puis sur cut-over je vais changer d'identité. – jon3laze

+0

Non, non. La nouvelle table obtient son propre champ d'identification. Les anciens ou nouveaux enregistrements obtiennent le nouvel identifiant lorsqu'ils sont insérés dans la nouvelle table. new_table.old_id vaut par défaut null, mais lorsque vous copiez des enregistrements à partir de l'ancienne table, vous attribuez à old_id la valeur old_table, id: insert new_table (c1, c2, old_id), sélectionnez c1, c2, id depuis old_table; – tpdi

Questions connexes