web-dev-qa-db-fra.com

SQL-Comment insérer une ligne sans incrémenter automatiquement une colonne ID?

J'ai une table qui a une colonne d'incrémentation automatique forcée et cette colonne est un ID très précieux qui est conservé dans toute l'application. Désolé de dire que ce fut un mauvais développement de ma part d'avoir cette colonne d'incrémentation automatique.

Voici donc le problème. Je dois insérer dans cette table un ID pour la colonne qui a déjà été créée et supprimée de la table. Un peu comme ressusciter cet ID et le remettre dans la table.

Alors, comment puis-je faire cela par programme, sans désactiver l'incrément de colonne. Corrigez-moi si je me trompe, si je le désactive par programme, il redémarrera à 0 ou 1 et je ne veux pas que cela se produise ...

28
SpoiledTechie.com

Si vous êtes dans Microsoft SQL Server, vous pouvez "désactiver" la fonctionnalité d'incrémentation automatique en émettant l'instruction Set Identity_Insert [TableName] On, un péché:

  Set Identity_Insert [TableName] On
  -- --------------------------------------------
  Insert TableName (pkCol, [OtherColumns])
  Values(pkValue, [OtherValues])
  -- ---- Don't forget to turn it back off ------
  Set Identity_Insert [TableName] Off
71
Charles Bretana

En plus de la réponse de Charles (qui est maintenant 100% correcte :-) et qui préserve la valeur actuelle de l'IDENTITÉ sur la table), vous pouvez également vérifier la valeur actuelle d'une IDENTITÉ sur une table - vous pouvez le faire avec cette commande ici:

DBCC CHECKIDENT('YourTableName')

Si vous avez réellement besoin de changer, vous pouvez le faire en utilisant cette commande ici:

DBCC CHECKIDENT ('YourTableName', RESEED, (new value for IDENTITY) )
8
marc_s

En fait, le code ci-dessus pour INDENTITY_INSERT est correct - l'activer indique au serveur que vous souhaitez insérer les valeurs vous-même. Il vous permet d'insérer des valeurs dans une colonne IDENTITY. Vous souhaitez ensuite le désactiver (permettant au serveur de générer et d'insérer les valeurs) lorsque vous avez terminé.

5
Donald Lancaster