sql-server - support - sql server management studio create auto increment




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

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

Comme le 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émentation automatique. Est-ce la bonne façon de procéder? Et si oui, comment puis-je remplir les chiffres initiaux?


Cela fonctionne dans MariaDB, donc je ne peux qu'espérer que cela se fasse dans SQL Server: déposez la colonne ID que vous venez d'insérer, puis utilisez la syntaxe suivante: -

ALTER TABLE nom_table 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 le remplit avec des valeurs séquentielles. Si SQL Server ne le fait pas, je suis désolé de perdre votre temps.


Créez une nouvelle table avec le nom différent et les mêmes colonnes, l'association de clé primaire et de clé étrangère et liez ceci dans votre instruction d'insertion de code. Par exemple: Pour EMPLOYÉ, remplacez 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 EMPLOYEE existante ou effectuer un ajustement en fonction de vos besoins.


Essayez quelque chose comme ça (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 n'ai pas testé cela du tout, alors faites attention!


Lorsque nous ajoutons et identifions une colonne dans une table existante, elle ne remplira pas automatiquement le champ manuellement.


Si la colonne existe déjà dans votre table et qu'elle est null, vous pouvez mettre à jour la colonne avec cette commande (remplacer id, tablename 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

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

renommez la table d'origine - table1 en table3 renommez la nouvelle table - table2 en table1 (table d'origine) Maintenant vous avez la table1 avec la colonne d'identité incluse et remplie pour les données existantes. Après vous être assuré qu'il n'y a pas de problème et que vous travaillez correctement, supprimez la table3 lorsque vous n'en avez plus besoin.


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

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

Si vous devez conserver un certain nombre de numéros, ajoutez les numéros 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.


Non - vous devez le faire dans l'autre sens: ajoutez-le dès le départ comme INT IDENTITY - il sera rempli de valeurs d'identité lorsque vous faites ceci:

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

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




alter-table