J'ai une base de données MS SQL 2005 avec une table Test
avec colonne ID
. ID
est une colonne d'identité.
J'ai des lignes dans ce tableau et toutes ont leur valeur incrémentée automatique ID correspondante.
Maintenant, je voudrais changer chaque identifiant de ce tableau comme ceci:
ID = ID + 1
Mais quand je fais cela, j'obtiens une erreur:
Impossible de mettre à jour la colonne d'identité "ID".
J'ai essayé ceci:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Mais cela ne résout pas le problème.
J'ai besoin d'avoir une identité définie sur cette colonne, mais je dois également modifier les valeurs de temps en temps. Ma question est donc de savoir comment accomplir cette tâche.
la source
#temp
table que vous supprimez ensuite, c'est une autre étape que vous n'avez pas comptée ici.IDENTITY
les valeurs de colonne sont immuables.Cependant, il est possible de changer les métadonnées de la table pour supprimer la
IDENTITY
propriété, faire la mise à jour, puis revenir en arrière.En supposant la structure suivante
Alors tu peux faire
Dans SQL Server 2012, il est possible d'avoir une colonne à incrémentation automatique qui peut également être mise à jour plus simplement avec
SEQUENCES
la source
Via l'interface utilisateur dans le gestionnaire SQL Server 2005, modifiez la colonne, supprimez la propriété de numéro automatique (identité) de la colonne (sélectionnez la table en cliquant dessus avec le bouton droit de la souris et choisissez «Conception»).
Exécutez ensuite votre requête:
Ensuite, ajoutez la propriété de numérotation automatique à la colonne.
la source
Id
valeurs d'identité automatique désactivées de 1.Premièrement, l'activation ou la désactivation de IDENTITY_INSERT ne fonctionnera pas pour ce dont vous avez besoin (il est utilisé pour insérer de nouvelles valeurs, telles que le colmatage des espaces).
L'opération via l'interface graphique crée simplement une table temporaire, copie toutes les données dans une nouvelle table sans champ d'identité et renomme la table.
la source
Cela peut être fait à l'aide d'une table temporaire.
L'idée
Requêtes SQL
Supposons que votre
test
table ait deux colonnes supplémentaires (column2
etcolumn3
) et qu'il y ait 2 tables ayant des clés étrangères référencéestest
appeléesforeign_table1
etforeign_table2
(car les problèmes de la vie réelle ne sont jamais simples).C'est tout.
la source
DBCC CHECKIDENT ('databasename.dbo.orders', RESEED, 999) vous pouvez modifier n'importe quel numéro de colonne d'identité avec cette commande, et vous pouvez également démarrer ce numéro de champ à partir de chaque numéro que vous voulez.Par exemple, dans ma commande, je demande de commencer à partir de 1000 (999 + 1) espèrent que ce serait suffisant ... bonne chance
la source
Si la colonne n'est pas un PK, vous pouvez toujours créer une NOUVELLE colonne dans la table avec les nombres incrémentés, supprimer l'original, puis modifier la nouvelle pour qu'elle devienne l'ancienne.
curieux de savoir pourquoi vous pourriez avoir besoin de faire cela ... la plupart que j'ai jamais eu à futz avec des colonnes d'identité était de remplir des numéros et j'ai juste fini par utiliser DBCC CHECKIDENT (tablename, RESEED, newnextnumber)
bonne chance!
la source
La modification d'identité peut échouer en fonction d'un certain nombre de facteurs, principalement autour des objets / relations liés à la colonne id. Il semble que la conception de la base de données soit aussi problématique ici que les identifiants devraient rarement, voire jamais, changer (je suis sûr que vous avez vos raisons et que vous effectuez les changements). Si vous avez vraiment besoin de changer les identifiants de temps en temps, je vous suggère de créer une nouvelle colonne d'identifiant factice qui n'est pas la clé primaire / numéro automatique que vous pouvez gérer vous-même et générer à partir des valeurs actuelles. Alternativement, l'idée de Chrisotphers ci-dessus serait mon autre suggestion si vous rencontrez des problèmes pour autoriser l'insertion d'identité.
Bonne chance
PS, cela n'échoue pas parce que l'ordre séquentiel dans lequel il s'exécute tente de mettre à jour une valeur de la liste vers un élément qui existe déjà dans la liste des identifiants? en s'accrochant à des pailles, ajoutez peut-être le nombre de lignes + 1, puis si cela fonctionne, soustrayez le nombre de lignes: -S
la source
Si vous devez modifier les identifiants occasionnellement, il est probablement préférable de ne pas utiliser de colonne d'identité. Dans le passé, nous avons implémenté manuellement les champs de numérotation automatique à l'aide d'une table «Compteurs» qui suit l'ID suivant pour chaque table. Nous l'avons fait parce que les colonnes d'identité causaient une corruption de la base de données dans SQL2000, mais la possibilité de modifier les ID était parfois utile pour les tests.
la source
Vous pouvez insérer de nouvelles lignes avec des valeurs modifiées, puis supprimer les anciennes lignes. L'exemple suivant change l'ID pour qu'il soit identique à la clé étrangère PersonId
la source
Enregistrez d'abord tous les ID et modifiez-les par programme aux valeurs que vous ne souhaitez pas, puis supprimez-les de la base de données, puis insérez-les à nouveau en utilisant quelque chose de similaire:
Pour une utilisation en vrac:
Exemple de données de file.csv:
Si vous ne
identity_insert
désactivez pas, vous obtiendrez l'erreur suivante:la source
J'ai vu un bon article qui m'a aidé au dernier moment. J'essayais d'insérer quelques lignes dans un tableau qui avait une colonne d'identité mais je l'ai fait à tort et je dois supprimer. Une fois que j'ai supprimé les lignes, ma colonne d'identité a été modifiée. J'essayais de trouver un moyen de mettre à jour la colonne qui a été insérée mais - pas de chance. Ainsi, lors de la recherche sur Google, un lien a été trouvé.
http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do- i-update-the-value-of-an.aspx
la source
Très belle question, nous devons d'abord sur IDENTITY_INSERT pour la table spécifique, après cela exécutez la requête d'insertion (Doit spécifier le nom de la colonne).
Remarque: après avoir modifié la colonne d'identité, n'oubliez pas de désactiver IDENTITY_INSERT. Si vous ne l'avez pas fait, vous ne pourrez pas modifier la colonne d'identité pour une autre table.
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
la source