Primärschlüssel in SQL Server Management Studio 2012 automatisch inkrementieren


446

Wie mache ich auto incrementdas primary keyin einer SQL ServerDatenbanktabelle, ich habe mich im Forum umgesehen, kann aber nicht sehen wie.

Ich habe die Eigenschaften überprüft, kann aber keine Option sehen. Ich habe eine Antwort gesehen, in der Sie zur IdentitySpezifikationseigenschaft gehen und sie auf yes und Identity incrementauf 1 setzen. Dieser Abschnitt ist jedoch ausgegraut und ich kann ihn nicht ändern das nein zu ja.

Es muss einen einfachen Weg geben, dies zu tun, aber ich kann ihn nicht finden.


5
Ist der Datentyp der Schlüsselspalte int?
Raab

1
@CoDe aDDict sein aktuelles Set als char (10), aber ich kann es ändern, während ich gerade
übe

Antworten:


703

intStellen Sie sicher, dass der Datentyp der Schlüsselspalte lautet, und legen Sie die Identität manuell fest, wie in der Abbildung dargestellt

Geben Sie hier die Bildbeschreibung ein

Oder führen Sie einfach diesen Code aus

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

Der Code wird ausgeführt, wenn dies IDnicht die einzige Spalte in der Tabelle ist

Bildreferenz Fifos


21
Nur ein bisschen Korrektur: Die IDENTITYEigenschaft auf alle numerischen Datentypen angewandt werden könnte (so könnte es sein tinyint, smallint, int, bigint, numeric, decimal), ist die einzige Einschränkung , dass es nicht gebrochene Zahl darstellen könnte (so es kann nicht sein float , oder real, weder numericoder decimal mit einer Skala ungleich Null ) und ofc sollte die Identitätsspezifikation mit dem ausgewählten Datentyp kompatibel sein.
Pred

2
Arbeiten, vorausgesetzt, es gibt keine Fremdschlüssel usw.
Andrew Day

3
Ich wollte nur hinzufügen, wenn Sie bereits einen Standardwert für Ihre Identitätsspalte festgelegt haben, bleibt das (Ist Identität) ausgegraut. Entfernen Sie den Standardwert, und er wird wieder verfügbar.
CDspace

7
Wenn Sie die Werte nicht ändern können, gehen Sie zu Extras-Optionen-Designer und deaktivieren Sie die Option "Speichern von Änderungen verhindern, die neu erstellt werden müssen".
Jaume

184

Wenn Sie die Tabelle erstellen, können Sie eine IDENTITYSpalte wie folgt erstellen :

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

Die IDENTITYEigenschaft erhöht die Spalte automatisch von Nummer 1. (Beachten Sie, dass der Datentyp der Spalte eine Ganzzahl sein muss.) Wenn Sie dies einer vorhandenen Spalte hinzufügen möchten, verwenden Sie einen ALTER TABLEBefehl.

Bearbeiten:
Ein bisschen getestet, und ich kann keine Möglichkeit finden, die Identitätseigenschaften über das Fenster Spalteneigenschaften für verschiedene Tabellen zu ändern. Ich denke, wenn Sie eine Spalte zu einer Identitätsspalte machen möchten, MÜSSEN Sie einen ALTER TABLEBefehl verwenden.


Ah, das ist speziell für SQL Server 2008 r2 - egal.
Josien

2
Diese Syntax zum Erstellen von Tabellen ist eine gute Vorgehensweise, wie vom Autor dieses Beitrags in Kommentaren empfohlen. Hoffnung hilft jemandem.
Shaijut

88

Sie müssen den Abschnitt Identität erweitern, um Inkrement und Startwert verfügbar zu machen.

Geben Sie hier die Bildbeschreibung ein

Bearbeiten: Ich habe angenommen, dass Sie einen ganzzahligen Datentyp haben, nicht char (10). Was vernünftig ist, würde ich sagen und gültig, wenn ich diese Antwort gepostet habe


2
Das yesist ausgegraut wie es ist char(10)(aus dem gerade geposteten Kommentar)
Martin Smith

@ Martin Smith ja, das scheint das allgemeine Problem zu sein, ich werde dies ändern und testen, vielen Dank
Ledgemonkey

Beim Erstellen einer neuen Tabelle, die ich verwendet habe, habe BookID int primary key identityich weder Startwert noch Inkrement angegeben. Ist das eine gute Vorgehensweise? Ursache Ich sehe Dokumentation in MSDN Wenn keine angegeben ist, ist der Standard (1,1).
Shaijut

40

Erweitern Sie Ihre Datenbank, erweitern Sie Ihre Tabelle, klicken Sie mit der rechten Maustaste auf Ihre Tabelle und wählen Sie Design aus der Dropdown-Liste aus. Es sieht aus wie das

Gehen Sie nun zu den Spalteneigenschaften unten, scrollen Sie nach unten und suchen Sie nach Identitätsspezifikation . Erweitern Sie sie, und Sie finden, dass Identität Ja macht. Wählen Sie nun rechts darunter Identitätsinkrement und geben Sie den Wert an, den Sie inkrementieren möchten. Geben Sie hier die Bildbeschreibung ein


1
Dies scheint mir die richtige Antwort zu sein. Nur den Datentyp zu einem Int zu machen, würde nicht ausreichen, oder?
Drewdin

10

Vielleicht fehlt mir etwas, aber warum funktioniert das nicht mit dem SEQUENCE-Objekt? Ist das nicht das, wonach du suchst?

Beispiel:

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

Wenn Sie in einem INSERT-Befehl auf die Squence verweisen, verwenden Sie einfach:

NEXT VALUE FOR blah.blahsequence

Weitere Informationen und Optionen für SEQUENCE


Diese Lösung ist die richtige, wenn Sie sich um die zeitliche Reihenfolge der eingefügten Zeilen kümmern, da IDENTITYSprünge manchmal Lücken hinterlassen und es dann wieder möglich ist, diese Lücken wieder zu füllen. So IDENTITYgarantiert nicht IMMER inkrmenet Zustand
FindOut_Quran

1
@ Martin Smith Ups, bin dem Link nicht gefolgt, mein Fehler! Ich habe mich so an MS-SQL gewöhnt, dass ich manchmal vergesse, dass es neuere Versionen gibt, die mehr unterstützen. Ich werde meinen Kommentar löschen, da er verwirrend sein könnte ... Wenn er allgemeiner ausgedrückt wird, bleibt er jedoch gültig: Könnte sein, dass er eine RDBMS-Marke / -Version verwendet, die SEQUENCE-Objekte nicht unterstützt - zumal die Frage nur a gestellt wurde wenige Monate nach der Veröffentlichung von SQL Server 2012;)
Paul Groke

1
@FindOut_Quran Sind Sie sicher, dass Lücken in IDENTITY-Spalten geschlossen sind? Ich habe nur mit SQL Server 2005 gearbeitet, wo ich das noch nie gesehen habe - die Lücken bleiben einfach bestehen. Und ich wäre ziemlich überrascht, wenn dies bei jedem RDBMS der Fall wäre, da eine solche Funktion eine seltsame Kombination aus "nicht kostenlos" (leistungsmäßig) und "nicht wünschenswert" (zumindest in den meisten Anwendungen) wäre.
Paul Groke

@ PaulGroke Ja, ich bin sicher. Sie können versuchen, eine Transaktion zum Einfügen von 1000 Zeilen und anschließendem Rollback zu verwenden. Der Identitätswert wird hochspringen. Versuchen Sie, mehr als tausend Zeilen einzufügen und ein Commit / oder Rollback durchzuführen. Sie werden feststellen, dass es manchmal zurückkehrt, um Lücken zu füllen
FindOut_Quran

@FindOut_Quran Ich kann nicht sehen, wie das passieren könnte. MS SQL IDENTITY-Spalten verwenden einen einfachen Zähler, der auf einen benutzerdefinierbaren Wert gesetzt und dann um einen benutzerdefinierbaren Wert erhöht wird. Sie können den Zähler sogar abfragen und zurücksetzen. Ich kann dies nur sehen, wenn gleichzeitige Transaktionen "außer Betrieb" sind. Dh die Transaktion, die zuerst den IDENTITY-Zähler gestoßen hat, wird nach einer anderen Transaktion festgeschrieben . In diesem Fall hätten Sie eine kurzlebige Lücke, die dann gefüllt wird. Welches ist notwendig, um Kollisionen zu vermeiden. Der IDENTITY-Zähler wird jedoch niemals zurückgesprungen sein.
Paul Groke

7

Wenn Sie Datentyp: int verwenden, können Sie die Zeile auswählen, die automatisch inkrementiert werden soll, und zum Tag mit den Spalteneigenschaften wechseln. Dort können Sie die Identität auf 'Ja' setzen. Dort kann auch der Startwert für die automatische Inkrementierung bearbeitet werden. Hoffe ich konnte helfen;)


Wo befinden sich die Spalteneigenschaften?

2

Ich hatte dieses Problem, bei dem ich die Tabelle bereits erstellt hatte und sie nicht ändern konnte, ohne die Tabelle zu löschen. Ich habe also Folgendes getan: (Ich bin mir nicht sicher, wann sie dies implementiert haben, hatte es aber in SQL 2016)

Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Tabelle:

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

Dann bearbeiten Sie das von Josien genannte Skript. Scrollen Sie nach unten, wo sich das CREATE TABLEbefindet, suchen Sie Ihren Primärschlüssel und hängen Sie ihn IDENTITY(1,1)an das Ende vor dem Komma an. Skript ausführen.

Das DROP and CREATE-Skript war aufgrund dieses Problems auch für mich hilfreich . (Was das generierte Skript behandelt.)


1

Seien Sie vorsichtig, wenn Sie möchten, dass die ID-Elemente contigius sind oder nicht. Als SQLSERVER ID kann um 1000 springen.

Beispiel: Vor dem Neustart ID = 11 Nach dem Neustart fügen Sie eine neue Zeile in die Tabelle ein, dann lautet die ID 1012.


1

Sie können das Schlüsselwort IDENTITYals Datentyp für die Spalte zusammen mit den PRIMARY KEYEinschränkungen beim Erstellen der Tabelle verwenden.
Ex:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Hier bedeutet die erste '1' den Startwert und die zweite '1' den inkrementierenden Wert.


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

Der MS SQL Server verwendet das Schlüsselwort IDENTITY, um eine automatische Inkrementierungsfunktion auszuführen.

Im obigen Beispiel ist der Startwert für IDENTITY 1 und wird für jeden neuen Datensatz um 1 erhöht.

Tipp: Um festzulegen, dass die Spalte "Personid" bei Wert 10 beginnen und um 5 erhöht werden soll, ändern Sie sie in IDENTITY (10,5).

Um einen neuen Datensatz in die Tabelle "Personen" einzufügen, müssen Sie KEINEN Wert für die Spalte "Personid" angeben (ein eindeutiger Wert wird automatisch hinzugefügt):


0

Wenn die Tabelle bereits ausgefüllt ist, kann eine Spalte nicht in eine IDENTITY-Spalte geändert oder in eine Nicht-IDENTITY-Spalte konvertiert werden. Sie müssten alle Daten exportieren, dann können Sie den Spaltentyp in IDENTITY ändern oder umgekehrt und dann Daten zurück importieren. Ich weiß, dass es ein schmerzhafter Prozess ist, aber ich glaube, dass es keine Alternative gibt, außer die in diesem Beitrag erwähnte Sequenz zu verwenden.


1
Sie können ALTER TABLE ... SWITCHnur die Metadaten wechseln, ohne die Daten berühren zu müssen. Beispiel: Sehen Sie, wie Sie das automatische Inkrementieren nach dem Erstellen einer Tabelle ohne Datenverlust festlegen.
Martin Smith

1
Der in dem von Ihnen bereitgestellten Link erwähnte Prozess beinhaltet die Übertragung der Daten in die temporäre Tabelle und zurück, was mit meiner obigen Aussage übereinstimmt. Wenn ich falsch liege, geben Sie mir bitte ein funktionierendes Beispiel.
Softec

1
Der Link enthält ein funktionierendes Beispiel. Es gibt kein "Übertragen der Daten in die temporäre Tabelle und zurück". `ALTER TABLE ... SWITCH` ist eine Änderung nur für Metadaten. Es werden keine Daten verschoben.
Martin Smith
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.