web-dev-qa-db-fra.com

SQL Server ajoute la clé primaire d'incrémentation automatique à la table existante

En tant que titre, j'ai une table existante qui contient déjà 150000 enregistrements. J'ai ajouté une colonne Id (qui est actuellement nulle).

Je suppose que je peux exécuter une requête pour remplir cette colonne avec des nombres incrémentiels, puis définir comme clé primaire et activer l'incrémentation automatique. Est-ce la bonne façon de procéder? Et si oui, comment puis-je remplir les numéros initiaux?

219
fearofawhackplanet

Non - vous devez le faire à l'inverse: ajoutez-le dès le départ sous le nom de INT IDENTITY - il sera rempli de valeurs d'identité lorsque vous le ferez:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

et alors vous pouvez en faire la clé primaire:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

ou si vous préférez tout faire en une étape:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
385
marc_s

Vous ne pouvez pas "activer" l'IDENTITE: c'est une reconstruction de table.

Si vous ne vous souciez pas de l'ordre des nombres, vous ajouteriez la colonne, NOT NULL, avec IDENTITY en une fois. 150k lignes n'est pas beaucoup.

Si vous devez conserver un ordre de nombre, ajoutez les chiffres en conséquence. Utilisez ensuite le concepteur de table SSMS pour définir la propriété IDENTITY. Cela vous permet de générer un script qui fera la colonne supprimer/ajouter/conserver des nombres/ré-alimenter pour vous.

18
gbn

J'avais ce problème, mais je ne pouvais pas utiliser une colonne d'identité (pour diverses raisons). Je me suis installé sur ceci:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Emprunté à ici .

11
Kevin

Si la colonne existe déjà dans votre table et qu'elle a la valeur null, vous pouvez la mettre à jour avec cette commande (replace id, nomtable et tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
4
Renzo Ciot

Si votre table est en relation avec d'autres tables à l'aide de sa clé primaire ou de clé, il est peut-être impossible de modifier votre table. vous devez donc supprimer et créer à nouveau la table.
Pour résoudre ces problèmes, vous devez générer des scripts en cliquant avec le bouton droit de la souris sur la base de données. ensuite, en utilisant ce script en modifiant la colonne pour identifier et régénérer la table à l’aide de l’exécution de sa requête.
votre requête sera comme ici:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 
2
Hamid

Lorsque nous ajoutons une colonne d'identité dans une table existante, elle est automatiquement renseignée, il n'est donc pas nécessaire de la renseigner manuellement.

2
user3279092

par le concepteur vous pouvez définir l’identité (1,1) clic droit sur tbl => desing => en partie gauche (clic droit) => propriétés => dans les colonnes d’identité, sélectionnez #colonne

Propriétés

colonne idendtity

2
gustavo herrera

Cette réponse est un petit ajout à la réponse la plus votée et fonctionne pour SQL Server. La question demandait une clé primaire à incrémentation automatique, la réponse actuelle ajoute la clé primaire, mais elle n'est pas marquée en tant qu'incrémentation automatique. Le script ci-dessous vérifie l'existence des colonnes, et l'ajoute avec l'indicateur d'auto-incrémentation activé.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO
0
John K.

Voici une idée que vous pouvez essayer. Table d'origine - pas de colonne d'identité table1 créez une nouvelle table - appelez table2 avec la colonne d'identité. copier les données de table1 dans table2 - la colonne identité est automatiquement renseignée avec des nombres incrémentés automatiquement.

renommer la table d'origine - table1 en table3 renommer la nouvelle table - table2 en table1 (table d'origine) Vous avez maintenant la table1 avec la colonne d'identité incluse et renseignée pour les données existantes. Après vous être assuré qu'il n'y a pas de problème et qu'il fonctionne correctement, supprimez la table3 lorsqu'elle n'est plus nécessaire.

0
JH326

Créez une nouvelle table avec un nom différent, des colonnes identiques, l'association de la clé primaire et de la clé étrangère et liez-la dans votre instruction de code Insert. Pour E.g: pour EMPLOYEE, remplacer par EMPLOYEES.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

Toutefois, vous devez supprimer la table EMPLOYEE existante ou procéder à des ajustements en fonction de vos besoins.

0
kumarP