SQL Server ajoute une clé primaire incrémentée automatiquement à la table existante

Comme titre, j'ai une table existante qui est déjà remplie avec 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ément automatique. Est-ce la bonne façon de procéder? Et si oui, comment remplir les numéros initiaux?

197
demandé sur marc_s 2011-02-01 15:11:45

13 réponses

Non, vous devez le faire dans l'autre sens: de l'ajouter à droite de l'aller comme INT IDENTITY - il sera rempli avec les valeurs d'identité lorsque vous faites cela:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

Et puis 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 seule étape:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
344
répondu marc_s 2017-07-14 09:53:10

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

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

Si vous devez conserver un certain ordre de nombres, ajoutez les nombres 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 drop/add/keep numbers/reseed pour vous.

18
répondu gbn 2011-02-01 12:17:56

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

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

Emprunté à ici .

9
répondu Kevin 2012-09-20 17:38:21

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

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
3
répondu Renzo Ciot 2014-07-14 14:50:52

Lorsque nous ajoutons et identity column dans une table existante, il ne sera pas nécessaire de le remplir manuellement.

2
répondu user3279092 2014-02-06 10:26:37

Par le concepteur, vous pouvez définir l'identité (1,1) cliquez avec le bouton droit sur tbl => desing = > en partie gauche (Clic droit) = > Propriétés = > dans les colonnes d'identité, sélectionnez # column

Propriétés

Colonne Idendtity

1
répondu gustavo herrera 2017-07-31 18:55:13

Voici une idée que vous pouvez essayer. Tableau Original-pas d'identité colonne table1 créez une nouvelle table - appelez table2 avec la colonne identité. copiez les données de table1 à table2 - la colonne identité est remplie automatiquement avec des nombres incrémentés automatiquement.

Renommez la table - table1 d'origine en table3 renommez la nouvelle table-table2 en table1 (table d'origine) Vous avez maintenant la colonne table1 avec identité incluse et remplie pour les données existantes. après avoir fait en sorte de ne pas problème et fonctionne correctement, déposer le tableau3 lorsqu'il n'est plus nécessaire.

0
répondu JH326 2016-07-20 15:40:56

Créez une nouvelle Table avec un nom différent et les mêmes colonnes, la clé primaire et l'association de clé étrangère et liez-la dans votre instruction Insert de code. Par exemple: pour Employé, remplacer par employés.

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)   
) 

Cependant, vous devez supprimer la Table des employés existante ou faire un ajustement en fonction de vos besoins.

0
répondu kumarP 2016-07-27 13:33:04

Si votre table a une relation avec d'autres tables en utilisant sa clé primaire ou foriegen, il est peut-être impossible de modifier votre table. vous devez donc laisser tomber et créer à nouveau la table.
Pour résoudre ces problèmes, vous devez générer des Scripts par un clic droit sur la base de données et dans l'option avancée définir le type de données à script au schéma et aux données. après cela, en utilisant ce script avec la modification de votre colonne pour identifier et régénérer la table en utilisant exécuter 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 
0
répondu Hamid 2017-10-27 08:02:50

Cette réponse est un petit ajout à la réponse la plus votée et fonctionne pour SQL Server. La question a demandé une clé primaire d'incrément automatique, la réponse actuelle ajoute la clé primaire, mais elle n'est pas marquée comme auto-incrément. Le script ci-dessous vérifie les colonnes, l'existence et l'ajoute avec l'indicateur autoincrement 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
répondu John K. 2018-03-21 14:01:54

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ; Cela pourrait être utile

-2
répondu Killer 2018-03-21 14:05:38

Essayez quelque chose comme ceci (sur une table de test en premier):

USE your_database_name
GO
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0
BEGIN
    SET ROWCOUNT 1
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1
END
PRINT 'ALL DONE'

Je ne l'ai pas testé du tout, alors faites attention!

-3
répondu PacDemon 2011-02-01 12:22:57

Cela fonctionne dans MariaDB, donc je ne peux qu'espérer que ce soit le cas dans SQL Server: déposez la colonne ID que vous venez d'Insérer, puis utilisez la syntaxe suivante: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

Pas besoin d'une autre table. Cela insère simplement une colonne id, en fait l'index principal et la remplit avec des valeurs séquentielles. Si SQL Server ne le fera pas, mes excuses pour perdre votre temps.

-3
répondu Road Warrior 2016-11-26 16:33:10