12
votes

Modification de la graine d'identité dans SQL Server (en permanence!)

Y a-t-il un moyen de modifier la graine d'identité pour une colonne d'identité de manière permanente? L'utilisation du checkeur DBCC semble simplement définir le last_value. Si la table est tronquée, toutes les valeurs sont réinitialisées.

alter table dbo.__Test_SeedIdent alter column idIdent [int] identity(1000,1) NOT NULL


1 commentaires

Exécution du profileur, je vois que MS crée une table temporaire, copie les données à travers, puis dépose la table existante et renomme la table Temp. Probablement parce qu'il peut y avoir plus d'une colonne d'identité.


4 Réponses :


3
votes

MSSQL ne vous permet pas d'ajouter ou de modifier une identité sur une colonne existante via TSQL très facilement. Vous devriez laisser tomber la colonne et l'ajouter à nouveau. Inutile de dire que cela peut jouer à l'enfer avec des relations FK. Vous pouvez le faire directement dans le gestionnaire d'entreprise. Cependant, cela ne sera pas amusant si vous devez le faire dans beaucoup de colonnes.

est-il nécessaire de créer un nouveau colonne, déplacez les valeurs sur, déposer la colonne d'origine et renommer le Nouveau?

yup et n'oubliez pas de réparer / mettre à jour tous les index, les relations clés étrangères, etc. qui sont liés à cette colonne


2 commentaires

Et ne pensez même pas à faire cela à une grande table!


Je recommanderais généralement de modifier toute table de production dans le gestionnaire d'entreprise. Parfois, il copiera, déposera et collera votre table pour accomplir l'action souhaitée.



0
votes

"Est-il nécessaire de créer une nouvelle colonne, déplacez les valeurs dans, déposez la colonne d'origine et renommez le nouveau?"

En réalité dans Enterprise Manager, lorsque vous ajoutez une colonne d'identité à une table existante (ou modifiez un champ de PK INT sur un ID de PK Int), cela le fait derrière la scène.


0 commentaires

16
votes

des livres en ligne:

"Pour changer la valeur de la graine d'origine et réessayer toutes les lignes existantes, vous devez déposer la colonne d'identité et recréer la spécification de la nouvelle valeur de graines. Lorsque la table contient des données, les numéros d'identité sont ajoutés aux lignes existantes avec la graine spécifiée avec la graine spécifiée et des valeurs d'incrément. L'ordre dans lequel les lignes sont mises à jour n'est pas garantie. "


0 commentaires

0
votes

Vous pouvez utiliser DBCC Checkident («Nom», Reseed, SeedValue)

Exemple: DBCC Checkident ('Clients', Reseat, 1350) Exécuter DBCC Checkident ("clients") à nouveau pour vérifier si la valeur de la graine actuelle a été définie.

Cependant, comme mentionné dans les réponses précédentes, cela ne modifiera pas les valeurs existantes stockées dans la colonne Identity. Il ne changera que la valeur de la graine de sorte que la ligne suivante qui soit insérée commence par cette valeur. L'incrémentation de l'identité reste la même (non modifiée) et ne peut pas être modifiée avec DBCC.


1 commentaires

Donnez simplement le problème, ne fournit pas de réponse.