J'ai hérité d'une database SQL (Microsoft?) Qui n'était pas très vierge dans son état d'origine. Il y a encore des choses très étranges que j'essaie de corriger – l'une d'entre elles est des inputs d'ID incohérentes.
Dans la table des counts, chaque input a un numéro appelé accountID, qui est référencé dans plusieurs autres tables (notes, équipement, etc.). Le problème est que les nombres (pour une raison random) – vont d'environ -100000 à +2000000 quand il y a environ seulement 7000 inputs.
Y a-t-il un bon moyen de les re-numéroter en changeant les nombres correspondants dans les autres tables? À ma disposition, j'ai aussi ColdFusion, donc tout ce qui fonctionne avec SQL et / ou que je vais accepter.
Pour les keys de substitution, elles sont sans signification, donc à less d'avoir un problème d'intégrité de database (comme si aucune contrainte de key étrangère n'était correctement définie) ou si votre identité approchait le maximum pour son type de données, je les laisserais un autre fruit à scope de main qui aurait plus d'impact.
Dans ce cas, il semble que «pourquoi» est une meilleure question que «comment». L'OP note qu'il y a un problème étrange qui doit être résolu mais ne dit pas pourquoi c'est un problème. Est-ce que cela cause des problèmes? Quel impact positif changerait ces numbers? À less que vous n'ayez programmé le système à l'origine et que vous compreniez précisément pourquoi le numéro est dans son état actuel, vous prenez des risques assez risqués pour effectuer des changements comme celui-ci.
Je voudrais parler à un comptable (ou au less à votre personnel financier) avant de jouer de toute façon avec les numéros dans les arrays des counts s'il s'agit d'une application financière. Le tableau des counts est très important pour la façon dont les finances sont déclarées. Ces identifiants peuvent avoir une signification que vous ne comprenez pas. Personne ne met un identifiant négatif à less d'avoir une raison. Je ne changerais en aucun cas cela à less que je comprenne pourquoi c'était négatif pour commencer. Vous pourriez vraiment bousiller votre déclaration d'impôt ou quelque chose d'autre en apportant un changement sans égal.
Vous pouvez probablement désactiver les relations de key étrangère (si vous êtes en mesure de le mettre hors connection temporairement), puis mettre à jour les keys primaires à l'aide d'un script. J'ai déjà utilisé ce script de mise à jour pour modifier les valeurs, et vous pouvez facilement envelopper ce code dans un slider pour parcourir les valeurs keys en question, une par une, et mettre à jour la valeur arbitraire avec une valeur incrémentée. de.
Découvrez le script ici: http://vyaskn.sortingpod.com/sql_server_search_and_replace.htm
Si vous avez juste une list de tables qui utilisent la key primaire, vous pouvez configurer une série d'instructions UPDATE qui s'exécutent à l'intérieur de votre slider, et vous n'aurez pas besoin d'utiliser ce script (qui peut être un peu lent).
Cela vaut la peine de requestr, cependant, pourquoi ces valeurs semblent hors de propos. Cette database comporte-t-elle des valeurs ajoutées et supprimées en permanence? Les valeurs de la key primaire sont-elles vraiment arbitraires ou semblent-elles simplement l'être, mais elles ont vraiment un sens? Bien que je sois tout à fait pour la consolidation, vous devriez vous assurer qu'il n'y a aucun but à ces valeurs.
Avec ColdFusion, cela ne devrait pas être une tâche herculéenne, mais ce sera compliqué et vous devrez faire attention. Une méthode que vous pourriez utiliser serait de scripter la database, puis de générer un tout nouveau schéma de table vide. Définissez le countID en tant que champ d'identité dans la nouvelle database.
Ensuite, en utilisant ColdFusion, écrivez une requête qui va extraire toutes les anciennes données de count et les insert dans la nouvelle database une par une. Pour chaque ligne, laissez la nouvelle database atsortingbuer un nouvel ID. Après chaque insertion, tirez le nouvel ID (en utilisant @@ IDENTITY ou MAX (accountID)) et stockez le nouvel ID et l'ancien ID dans une table temporaire pour savoir quels anciens ID appartiennent à quels nouveaux ID.
Ensuite, répétez le process avec chacune des tables enfant. Pour chaque ancien ID, tirez ses inputs enfants et réinsérez-les dans la nouvelle database en utilisant les nouveaux ID. Si les keys primaires des tables enfant sont correctes, vous pouvez les insert telles quelles ou laisser le server en affecter de nouvelles si elles ne sont pas importantes.
L'atsortingbution de nouveaux ID en désactivant temporairement les relations peut fonctionner, mais vous risquez également de rencontrer des conflits si l'une des inputs est associée à un ID déjà utilisé par les anciennes données, ce qui peut provoquer des conflits.
Créez une nouvelle colonne dans la table des counts pour votre nouvel ID et une nouvelle colonne dans chacune de vos tables associées pour referencer la nouvelle colonne ID.
ALTER TABLE accounts ADD new_accountID int IDENTITY ALTER TABLE notes ADD new_accountID int ALTER TABLE equipment ADD new_accountID int
Vous pouvez ensuite associer la colonne new_accountID de chacune de vos tables de reference à la table accounts.
UPDATE notes SET new_accountID = accounts.new_accountID FROM accounts INNER JOIN notes ON (notes.accountID = accounts.accountID) UPDATE equipment SET new_accountID = accounts.new_accountID FROM accounts INNER JOIN equipment ON (equipment.accountID = accounts.accountID)
À ce stade, chaque table a deux accountID avec les anciennes keys, et new_accountID avec les nouvelles keys. D'ici, ça devrait être assez simple.