Incrémentation automatique de la clé primaire dans SQL Server Management Studio 2012


447

Comment puis-je auto incrementle primary keydans une SQL Servertable de base de données, j'ai parcouru le forum mais je ne vois pas comment.

J'ai regardé les propriétés mais je ne vois pas d'option, j'ai vu une réponse où vous allez à la Identitypropriété de spécification et la définissez sur oui et définissez la Identity incrementsur 1, mais cette section est grisée et je ne peux pas changer le non à oui.

Il doit y avoir un moyen simple de le faire, mais je ne le trouve pas.


5
Le type de données de la colonne clé est-il int?
Raab

1
@CoDe aDDict son ensemble actuel comme char (10) mais je peux le changer car je ne fais que pratiquer, merci
Ledgemonkey

Réponses:


704

Assurez-vous que le type de données de la colonne Clé est intpuis définissez l'identité manuellement, comme le montre l'image

entrez la description de l'image ici

Ou exécutez simplement ce code

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

le code s'exécutera, s'il IDn'est pas la seule colonne du tableau

référence image fifo


21
Juste un peu de correction: La IDENTITYpropriété pourrait être appliquée à tout type de données numériques (il pourrait être tinyint, smallint, int, bigint, numeric, decimal), la seule contrainte est qu'il ne pouvait pas représenter le nombre fractionnaire (donc il ne peut pas être float ou real, ni numericou decimal avec une échelle non nulle ) et ofc, la spécification d'identité doit être compatible avec le type de données sélectionné.
Pred

2
Travail, à condition qu'il n'y ait pas de clés étrangères, etc.
Andrew Day

3
Je voulais juste ajouter que si vous avez déjà défini une valeur par défaut dans votre colonne d'identité, (Is Identity) reste grisé. Supprimez la valeur par défaut et elle redeviendra disponible.
CDspace

7
Si vous ne pouvez pas modifier les valeurs, accédez à Tools-Options-Designers et décochez l'option "Empêcher l'enregistrement des modifications nécessitant une recréation".
Jaume

185

Lorsque vous créez le tableau, vous pouvez créer une IDENTITYcolonne comme suit:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

La IDENTITYpropriété incrémente automatiquement la colonne à partir du numéro 1. (Notez que le type de données de la colonne doit être un entier.) Si vous souhaitez l'ajouter à une colonne existante, utilisez une ALTER TABLEcommande.

Edit:
Testé un peu, et je ne trouve pas de moyen de modifier les propriétés d'identité via la fenêtre Propriétés de la colonne pour différentes tables. Je suppose que si vous voulez faire d'une colonne une colonne d'identité, vous DEVEZ utiliser une ALTER TABLEcommande.


Ah, c'est spécifiquement pour SQL Server 2008 r2 - peu importe.
Josien

2
cette syntaxe de création de table est une bonne pratique comme conseillé par l'auteur de ce post dans les commentaires, espérons aider quelqu'un.
shaijut du

88

Vous devez développer la section Identité pour exposer l'incrémentation et l'amorçage.

entrez la description de l'image ici

Edit: je supposais que vous auriez un type de données entier, pas char (10). Ce qui est raisonnable, je dirais et valide lorsque j'ai posté cette réponse


2
Le yesest grisé tel quel char(10)(d'après le commentaire qui vient d'être publié)
Martin Smith

@Martin Smith oui cela semble être le problème général, je vais changer cela et tester, merci beaucoup
Ledgemonkey

lors de la création d'une nouvelle table que j'ai utilisée, BookID int primary key identityje n'ai pas spécifié à la fois l'amorce et l'incrémentation, est-ce une bonne pratique? parce que je vois la documentation dans MSDN Si aucun n'est spécifié, la valeur par défaut est (1,1).
shaijut

40

Développez votre base de données, développez votre table, faites un clic droit sur votre table et sélectionnez la conception dans la liste déroulante. Il ressemble à ceci

Maintenant, allez dans les propriétés de la colonne en dessous de celle-ci, faites défiler vers le bas et trouvez les spécifications d'identité , développez-la et vous trouverez Is Identity make it Yes. Maintenant, choisissez Incrément d'identité juste en dessous de lui donner la valeur que vous souhaitez incrémenter en elle. entrez la description de l'image ici


1
cela semble que ce serait la bonne réponse pour moi, juste faire le type de données un int ne ferait pas l'affaire, non?
Drewdin

10

Peut-être que je manque quelque chose, mais pourquoi cela ne fonctionne-t-il pas avec l'objet SEQUENCE? N'est-ce pas ce que vous cherchez?

Exemple:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

Lorsque vous référencez la séquence dans une commande INSERT, utilisez simplement:

NEXT VALUE FOR blah.blahsequence

Plus d'informations et d'options pour SEQUENCE


Cette solution est la bonne si vous vous souciez de l'ordre temporel des lignes insérées, car IDENTITYparfois saute en laissant des lacunes, il est de retour de combler ces lacunes à nouveau. IDENTITYNe garantit donc pas toujours l'état
incrmenet

1
@Martin Smith Oups, je n'ai pas suivi le lien, mon erreur! Je me suis tellement habitué à MS-SQL n'ayant pas certaines fonctionnalités que j'oublie parfois qu'il existe des versions plus récentes qui prennent en charge plus de choses. Je vais supprimer mon commentaire car il pourrait être déroutant ... S'il est exprimé de manière plus générale, il reste cependant valable: pourrait être qu'il utilise une marque / version de SGBDR qui ne prend pas en charge les objets SEQUENCE - d'autant plus que la question n'a été posée que quelques mois après la sortie de SQL Server 2012;)
Paul Groke

1
@FindOut_Quran Êtes-vous sûr que les lacunes dans les colonnes IDENTITY sont remplies? Je n'ai travaillé qu'avec SQL Server 2005 où je n'ai jamais vu cela se produire - les lacunes demeurent simplement. Et je serais plutôt surpris de voir cela se produire sur n'importe quel SGBDR, car une telle fonctionnalité serait une étrange combinaison de «non libre» (en termes de performances) et «non souhaitable» (au moins dans la plupart des applications).
Paul Groke

@PaulGroke Oui, j'en suis sûr. Vous pouvez essayer d'utiliser une transaction pour insérer 1000 lignes, puis annuler. La valeur d'idénétité se met à sauter. Essayez d'insérer plus de milliers de lignes et de valider / ou annuler. Vous remarquerez qu'il recule parfois pour combler les lacunes
FindOut_Quran

@FindOut_Quran Je ne vois pas comment cela pourrait se produire. Les colonnes MS SQL IDENTITY utilisent un compteur simple qui est initialisé à une valeur définissable par l'utilisateur, puis incrémenté d'une valeur définissable par l'utilisateur. Vous pouvez même interroger et réinitialiser le compteur. La seule façon dont je peux voir que cela se produit est lorsque les transactions simultanées sont validées "hors service". À savoir la transaction qui a été la première cognant le compteur de IDENTITÉ commits après une autre transaction. Dans ce cas, vous auriez un écart de courte durée qui serait alors comblé. Ce qui est nécessaire pour éviter les collisions. Le compteur IDENTITY n'aura cependant jamais reculé.
Paul Groke

7

Lorsque vous utilisez Data Type: int, vous pouvez sélectionner la ligne que vous souhaitez obtenir auto-incrémentée et aller à la balise de propriétés de colonne. Là, vous pouvez définir l'identité sur «oui». La valeur de départ pour l'incrémentation automatique peut également y être modifiée. J'espère que je pourrais aider;)


où se trouvent les propriétés de la colonne?

2

J'ai eu ce problème où j'avais déjà créé la table et ne pouvais pas la changer sans supprimer la table, donc ce que j'ai fait était: (Je ne sais pas quand ils l'ont implémenté mais l'avaient dans SQL 2016)

Faites un clic droit sur la table dans l'Explorateur d'objets:

Script Table as > DROP And CREATE To > New Query Editor Window

Faites ensuite la modification du script dit par Josien; CREATE TABLEfaites défiler vers le bas où se trouve le, trouvez votre clé primaire et ajoutez-le IDENTITY(1,1)à la fin avant la virgule. Script de lancement.

Le script DROP and CREATE m'a également été utile à cause de ce problème. (Ce que le script généré gère.)


1

Faites attention, comme si vous vouliez que les éléments d'identification soient contigius ou non. Comme l'ID SQLSERVER peut sauter de 1000.

Exemple: avant redémarrage ID = 11 après redémarrage, vous insérez une nouvelle ligne dans le tableau, puis l'ID sera 1012.


1

Vous pouvez utiliser le mot-clé IDENTITYcomme type de données pour la colonne avec une PRIMARY KEYcontrainte lors de la création de la table.
ex:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Ici, le premier «1» signifie la valeur de départ et le second «1» est la valeur d'incrémentation.


1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL Server utilise le mot-clé IDENTITY pour effectuer une fonction d'incrémentation automatique.

Dans l'exemple ci-dessus, la valeur de départ pour IDENTITY est 1 et elle augmentera de 1 pour chaque nouvel enregistrement.

Conseil: Pour spécifier que la colonne "Personid" doit commencer à la valeur 10 et incrémenter de 5, remplacez-la par IDENTITY (10,5).

Pour insérer un nouvel enregistrement dans la table "Personnes", nous n'aurons PAS à spécifier de valeur pour la colonne "Personid" (une valeur unique sera ajoutée automatiquement):


0

Si le tableau est déjà rempli, il n'est pas possible de changer une colonne en colonne IDENTITY ou de la convertir en colonne non IDENTITY. Vous devrez exporter toutes les données, puis vous pouvez changer le type de colonne en IDENTITY ou vice versa, puis réimporter les données. Je sais que c'est un processus douloureux mais je crois qu'il n'y a pas d'autre alternative que d'utiliser la séquence comme mentionné dans ce post.


1
Vous pouvez utiliser ALTER TABLE ... SWITCHpour simplement changer les métadonnées sans avoir à toucher du tout aux données. Par exemple, voyez comment définir l'incrémentation automatique après avoir créé une table sans aucune perte de données?
Martin Smith

1
Le processus mentionné dans le lien fourni par vous implique le transfert des données vers la table temporaire et inversée, ce qui correspond à ma déclaration ci-dessus. Si je me trompe, veuillez me fournir un exemple de travail.
Softec

1
Il y a un exemple de travail dans le lien. Il n'y a pas de "transfert des données vers la table temporaire et retour". `ALTER TABLE ... SWITCH` est un changement de métadonnées uniquement. Il ne déplace aucune donnée.
Martin Smith
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.