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?
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
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.
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
Lorsque nous ajoutons et identity column dans une table existante, il ne sera pas nécessaire de le remplir manuellement.
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
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.
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.
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
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
ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ; Cela pourrait être utile
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!
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.