Vous ne pouvez pas modifier les colonnes existantes pour l'identité.
Vous avez 2 options,
Créer une nouvelle table avec identité et supprimer la table existante
Créer une nouvelle colonne avec identité et supprimer la colonne existante
Approche 1. ( Nouveau tableau ) Ici, vous pouvez conserver les valeurs de données existantes dans la colonne d'identité nouvellement créée.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Approche 2 ( nouvelle colonne ) Vous ne pouvez pas conserver les valeurs de données existantes dans la colonne d'identité nouvellement créée, la colonne d'identité contiendra la séquence de nombres.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Consultez le message suivant du forum Microsoft SQL Server pour plus de détails:
Comment modifier la colonne en identité (1,1)
IDENTITY(1, 1)
partie avec la colonne de clé primaireDans SQL 2005 et versions ultérieures, il existe une astuce pour résoudre ce problème sans modifier les pages de données de la table. Ceci est important pour les grands tableaux où toucher chaque page de données peut prendre des minutes ou des heures. L'astuce fonctionne également même si la colonne d'identité est une clé primaire, fait partie d'un index clusterisé ou non clusterisé, ou d'autres pièges qui peuvent déclencher la solution la plus simple "ajouter / supprimer / renommer la colonne".
Voici l'astuce: vous pouvez utiliser l'instruction ALTER TABLE ... SWITCH de SQL Server pour modifier le schéma d'une table sans modifier les données, ce qui signifie que vous pouvez remplacer une table par une IDENTITY par un schéma de table identique, mais sans colonne IDENTITY. La même astuce fonctionne pour ajouter IDENTITY à une colonne existante.
Normalement, ALTER TABLE ... SWITCH est utilisé pour remplacer efficacement une partition complète dans une table partitionnée par une nouvelle partition vide. Mais il peut également être utilisé dans des tables non partitionnées.
J'ai utilisé cette astuce pour convertir, en moins de 5 secondes, une colonne d'une table de 2,5 milliards de lignes d'IDENTITY en non-IDENTITY (afin d'exécuter une requête de plusieurs heures dont le plan de requête fonctionnait mieux pour les non-IDENTITY colonnes), puis restauré le paramètre IDENTITY, à nouveau en moins de 5 secondes.
Voici un exemple de code de son fonctionnement.
Cela est évidemment plus complexe que les solutions des autres réponses, mais si votre table est grande, cela peut vous sauver la vie. Il y a quelques mises en garde:
Il y a un bon article sur TechNet détaillant les exigences ci-dessus.
MISE À JOUR - Eric Wu avait un commentaire ci-dessous qui ajoute des informations importantes sur cette solution. Copiez-le ici pour vous assurer qu'il reçoit plus d'attention:
Si la table est activement étendue avec de nouvelles lignes (ce qui signifie que vous n'avez pas beaucoup ou pas de temps d'arrêt entre l'ajout d'IDENTITY et l'ajout de nouvelles lignes, alors au lieu de
DBCC CHECKIDENT
vous voudrez définir manuellement la valeur de départ de l'identité dans le nouveau schéma de table pour être plus grand que le plus grand ID existant dans le tableau, par exempleIDENTITY (2435457, 1)
. Vous pourriez être en mesure d'inclure à la fois leALTER TABLE...SWITCH
et leDBCC CHECKIDENT
dans une transaction (ou pas - je n'ai pas testé cela), mais il semble que la définition manuelle de la valeur de départ sera plus facile et plus sûre.De toute évidence, si aucune nouvelle ligne n'est ajoutée à la table (ou si elles ne sont ajoutées qu'occasionnellement, comme un processus ETL quotidien), cette condition de concurrence critique ne se produira pas
DBCC CHECKIDENT
.la source
DBCC CHECKIDENT('<newTableName>')
immédiatement après le changement. Voir msdn.microsoft.com/en-us/library/ms176057.aspx pour plus d'informations.Vous ne pouvez pas modifier une colonne pour être une colonne IDENTITY. Ce que vous devez faire est de créer une nouvelle colonne qui est définie comme une IDENTITÉ dès le départ, puis de supprimer l'ancienne colonne et de renommer la nouvelle en l'ancien nom.
Marc
la source
Il existe une solution intéressante décrite ici: SQL SERVER - Ajouter ou supprimer une propriété d'identité sur la colonne
En bref, modifiez manuellement votre table dans SQL Manager, changez l'identité, NE PAS ENREGISTRER les modifications, affichez simplement le script qui sera créé pour les modifications, copiez-le et utilisez-le plus tard.
C'est un gain de temps énorme, car il (le script) contient toutes les clés étrangères, les index, etc. liés à la table que vous modifiez. L'écriture manuelle ... Dieu ne plaise.
la source
Pensez à utiliser SEQUENCE au lieu d'IDENTITY .
Dans SQL Server 2014 (je ne connais pas les versions inférieures), vous pouvez le faire simplement, en utilisant la séquence.
À partir d'ici: séquence comme valeur par défaut pour une colonne
la source
Explication simple
Renommez la colonne existante à l'aide de sp_RENAME
EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
Exemple pour renommer:
La colonne existante UserID est renommée OldUserID
Ajoutez ensuite une nouvelle colonne en utilisant alter query pour définir comme clé primaire et valeur d'identité
Exemple pour définir la clé primaire
Le nouveau nom de colonne créé est UserID
puis supprimez la colonne renommée
Exemple pour la colonne renommée Drop
Nous avons maintenant ajouté une clé primaire et une identité à la colonne existante de la table.
la source
Je suis un développeur java qui a fait partie d'une équipe sans DBA et où, en tant que développeur, je ne peux pas obtenir de droits DBA. J'ai été chargé de déplacer un schéma entier entre deux bases de données, donc sans avoir un DBA, je devais le faire et le faire en exécutant des scripts, ne pouvant pas utiliser l'interface graphique dans SQL Server 2008 car je n'avais pas de privilèges d'administrateur.
Tout a été déplacé sans problème, cependant, lors de l'exécution d'une procédure stockée sur la nouvelle table schema.table, j'ai trouvé que j'avais perdu le champ d'identité dans une table. J'ai revérifié le script qui a créé la table et il était là, cependant, SQL Server ne l'a pas obtenu lorsque j'ai exécuté le script. Un DBA m'a dit plus tard qu'il avait déjà vu ce même problème auparavant.
En tout état de cause, pour SQL Server 2008, ce sont les étapes que j'ai prises pour résoudre ce problème et cela a fonctionné, donc je le poste ici dans l'espoir que cela sera utile à quelqu'un. C'est ce que j'ai fait car j'avais des dépendances FK sur une autre table qui ont rendu cela plus difficile:
J'ai utilisé cette requête pour vérifier que l'identité était effectivement manquante et pour afficher les dépendances sur la table.
1.) Trouvez des statistiques sur un tableau:
2.) Créez une nouvelle table identique en double, sauf ajoutez un champ d'identité sur le champ PK où il se trouvait auparavant.
3.) Désactivez l'identité pour déplacer les données.
4.) Transférez les données.
5.) Vérifiez que les données sont là.
6.) Réactivez l'identité.
7.) C'est le meilleur script que j'ai trouvé pour obtenir toutes les relations FK pour vérifier quelle (s) table (s) les références de table d'origine en tant que dépendances et j'en ai rencontré beaucoup, c'est donc un gardien!
8.) Assurez-vous que vous disposez de tous les scripts PK et FK pour toutes les tables impliquées, avant cette étape suivante.
9.) Vous pouvez cliquer avec le bouton droit sur chaque clé et l'écrire à l'aide de SQL Server 2008
10.) Supprimez les FK de la ou des tables de dépendances en utilisant cette syntaxe:
11.) Déposez la table d'origine:
13.) Ces étapes suivantes s'appuient sur les scripts que vous avez créés dans SQL Server 2008 à l'étape 9.
--Ajouter le PK à la nouvelle table.
--Ajouter le FK à la nouvelle table.
--Ajouter le dos du FK à la table des dépendances.
14.) Vérifiez que tout est correct et complet. J'ai utilisé l'interface graphique pour regarder les tableaux.
15.) Renommez la nouvelle table en son nom d'origine.
Enfin, tout a fonctionné!
la source
vous ne pouvez pas le faire comme ça, vous devez ajouter une autre colonne, supprimer la colonne d'origine et renommer la nouvelle colonne ou créer une nouvelle table, copier les données et supprimer l'ancienne table, puis renommer la nouvelle table en l'ancienne table
si vous utilisez SSMS et définissez la propriété d'identité sur ON dans le concepteur, voici ce que fait SQL Server en arrière-plan. Donc, si vous avez une table nommée [utilisateur], c'est ce qui se passe si vous définissez UserID et identité
Cela dit, il existe un moyen de pirater la table système pour y parvenir en définissant la valeur au niveau du bit, mais cela n'est pas pris en charge et je ne le ferais pas
la source
Comme je l' ai compris dans les cas normaux , nous créons une table avec clé primaire qui est d' avoir la propriété Identity
Ainsi Renommer ou Supprimer une colonne qui est associée à la clé primaire contrainte ne sera pas possible parce que les règles de contrainte valident la structure de la colonne.
Pour y parvenir, nous devons traiter certaines étapes de la manière suivante:
Supposons que TableName = 'Employee' et ColumnName = 'EmployeeId'
1. Ajoutez une nouvelle colonne 'EmployeeId_new' dans la table 'Employee'
ALTER TABLE Employee ADD EmployeeId_new INT IDENTITY ( 1,1)
Maintenant, supprimez la colonne 'EmployeeId' de la table 'Employee'
ALTER TABLE Employee DROP COLUMN EmployeeId
Cela générera une erreur car les règles de contrainte de clé primaire sont applicables et valident la structure des colonnes.
* ### ' Msg 5074, niveau 16, état 1, ligne 1 L'objet [PK_dbo.Employee] dépend de colmn [EmployeeId].' ###
Nous devons donc d'abord supprimer la contrainte de clé primaire de la table 'Employé', puis nous pouvons supprimer la colonne
ALTER TABLE Contrainte DROP des employés [PK_dbo.Employee]
Maintenant, nous pouvons supprimer la colonne 'EmployeeId' de la table 'Employee' comme cela a été fait à l'étape précédente où nous avons eu une erreur
ALTER TABLE Employee DROP COLUMN EmployeeId
Maintenant, la colonne 'EmployeeId' a été supprimée du tableau. Nous allons donc renommer la nouvelle colonne 'EmployeeId_new' nouvellement ajoutée avec 'EmployeeId'
sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN'
Pour réorganiser la table sous la même forme qu'elle l'était, nous devons ajouter la contrainte de clé primaire pour la colonne 'EmployeeId'
ALTER TABLE Clé primaire de contrainte d'ajout d'employé [PK_dbo.Employee] (EmployeeId)
8. Maintenant, la table «Employee» avec «EmployeeId» est modifiée pour les règles d'identité avec la contrainte de clé primaire existante
la source
De par sa conception, il n'existe aucun moyen simple d'activer ou de désactiver la fonctionnalité d'identité pour une colonne existante. La seule façon propre de le faire est de créer une nouvelle colonne et d'en faire une colonne d'identité ou de créer une nouvelle table et de migrer vos données.
Si nous utilisons SQL Server Management Studio pour supprimer la valeur d'identité de la colonne "id", une nouvelle table temporaire est créée, les données sont déplacées vers la table temporaire, l'ancienne table est supprimée et la nouvelle table est renommée.
Utilisez Management Studio pour effectuer la modification, puis cliquez avec le bouton droit dans le concepteur et sélectionnez "Générer le script de modification".
Vous verrez que c'est ce que fait SQL Server en arrière-plan.
la source
Il n'y en a pas, malheureusement; la propriété IDENTITY appartient à la table plutôt qu'à la colonne.
Le moyen le plus simple est de le faire dans l'interface graphique, mais si ce n'est pas une option, vous pouvez faire le long chemin pour copier les données, supprimer la colonne, la rajouter avec l'identité et remettre les données.
Voir ici pour un compte coup par coup.
la source
Cliquez avec le bouton droit sur le nom de la table dans l'Explorateur d'objets. Vous obtiendrez quelques options. Cliquez sur «Design». Un nouvel onglet sera ouvert pour ce tableau. Vous pouvez ajouter une contrainte d'identité ici dans «Propriétés de la colonne».
la source
Pour modifier les propriétés d'identité d'une colonne:
C'est ça, et ça a marché pour moi
la source
Si vous utilisez Visual Studio 2017+
Cela fera tout pour vous.
la source
Si l'affiche d'origine voulait réellement définir une colonne existante comme une
PRIMARY KEY
pour la table et n'avait pas besoin que la colonne soit uneIDENTITY
colonne (deux choses différentes), cela peut être fait via t-SQL avec:Notez la parenthèse autour du nom de la colonne après l'
PRIMARY KEY
option.Bien que ce message soit ancien et que je fasse une supposition sur les besoins des demandeurs, je pensais que ces informations supplémentaires pourraient être utiles aux utilisateurs rencontrant ce fil car je pense que la conversation pourrait faire croire qu'une colonne existante ne peut pas être définie comme un clé primaire sans l'ajouter en tant que nouvelle colonne, ce qui serait incorrect.
la source
Selon mon état actuel, je suis cette approche. Je veux donner une identité à une table primaire après l'insertion de données via un script.
Comme je veux ajouter une identité, cela commence toujours de 1 à la fin du nombre d'enregistrements que je veux.
Cela créera la même colonne de clé primaire avec l'identité
J'ai utilisé ces liens: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Ajouter une clé primaire à une table existante
la source
Je ne pense pas que vous puissiez modifier une colonne existante pour être une colonne d'identité à l'aide de tsql. Cependant, vous pouvez le faire via la vue de conception Enterprise Manager.
Vous pouvez également créer une nouvelle ligne comme colonne d'identité, supprimer l'ancienne colonne, puis renommer votre nouvelle colonne.
la source
Fondamentalement, il y a quatre étapes logiques.
Créez une nouvelle colonne d'identité. Activez Insérer une identité pour cette nouvelle colonne.
Insérez les données de la colonne source (la colonne que vous souhaitez convertir en identité) dans cette nouvelle colonne.
Désactivez l'option Insérer une identité pour la nouvelle colonne.
Déposez votre colonne source et renommez la nouvelle colonne au nom de la colonne source.
Il peut y avoir quelques complexités plus comme travailler sur plusieurs serveurs, etc.
Veuillez consulter l'article suivant pour les étapes (à l'aide de ssms et T-sql). Ces étapes sont destinées aux débutants avec moins d'adhérence sur T-SQL.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
la source
génère un script pour toutes les tables avec clé primaire = bigint qui n'ont pas d'identité définie; cela renverra une liste de scripts générés avec chaque table;
la source