Chiave primaria di incremento automatico in SQL Server Management Studio 2012


447

Come faccio auto incrementl' primary keyin una SQL Servertabella di database, ho avuto uno sguardo attraverso il forum, ma non riesco a vedere come.

Ho guardato le proprietà ma non riesco a vedere un'opzione, ho visto una risposta in cui vai alla Identityproprietà specifica e impostala su Sì e imposta Identity incrementsu 1, ma quella sezione è disattivata e non posso cambiare il no al si.

Ci deve essere un modo semplice per farlo ma non riesco a trovarlo.


5
Il tipo di dati della colonna chiave è int?
Raab,

1
@CoDe aDDict è attualmente impostato come char (10) ma posso cambiarlo mentre mi sto solo esercitando, grazie
Ledgemonkey,

Risposte:


704

Assicurati che il tipo di dati della colonna Chiave sia inte quindi imposta manualmente l'identità, come mostra l'immagine

inserisci qui la descrizione dell'immagine

O esegui semplicemente questo codice

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

il codice verrà eseguito, se IDnon è l'unica colonna nella tabella

immagine di riferimento FIFO


21
Appena un po 'di correzione: La IDENTITYproprietà può essere applicata a qualsiasi tipo di dati numerici (quindi potrebbe essere tinyint, smallint, int, bigint, numeric, decimal), l'unico vincolo è che non poteva rappresentare numero frazionario (in modo che non può essere float o real, né numericoppure decimal con scala diversa da zero ) e ofc, le specifiche di identità devono essere compatibili con il tipo di dati selezionato.
Pred

2
Lavoro, a condizione che non ci siano chiavi esterne ecc.
Andrew Day

3
Volevo solo aggiungere, se hai già impostato un valore predefinito nella colonna della tua identità, (Is Identity) rimane disattivato. Rimuovi il valore predefinito e diventa nuovamente disponibile.
CDspace,

7
Se non riesci a modificare i valori, vai su Strumenti-Opzioni-Progettisti e deseleziona l'opzione "impedisce il salvataggio delle modifiche che richiedono una ricostruzione".
Jaume,

185

Quando si crea la tabella, è possibile creare una IDENTITYcolonna come segue:

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

La IDENTITYproprietà incrementerà automaticamente la colonna dal numero 1. (Si noti che il tipo di dati della colonna deve essere un numero intero.) Se si desidera aggiungere questo a una colonna esistente, utilizzare un ALTER TABLEcomando.

Modifica:
testato un po 'e non riesco a trovare un modo per modificare le proprietà dell'identità tramite la finestra Proprietà colonna per varie tabelle. Immagino che se vuoi trasformare una colonna in una colonna di identità, DEVI usare un ALTER TABLEcomando.


Ah, questo è specifico per SQL Server 2008 r2 - non importa.
Josien,

2
questa sintassi della tabella di creazione è una buona pratica come consigliato dall'autore di questo post nei commenti, la speranza aiuta qualcuno.
shaijut

88

Devi espandere la sezione Identità per esporre l'incremento e il seed.

inserisci qui la descrizione dell'immagine

Modifica: supponevo che avessi un tipo di dati intero, non char (10). Il che è ragionevole direi e valido quando ho pubblicato questa risposta


2
È yesdisattivato così com'è char(10)(dal commento appena pubblicato)
Martin Smith,

@Martin Smith sì, questo sembra essere il problema generale, ho intenzione di cambiare questo e testare, molte grazie
Ledgemonkey

durante la creazione di una nuova tabella che ho usato BookID int primary key identitynon ho specificato sia seed che increment, è una buona pratica? causa vedo la documentazione in MSDN Se nessuno dei due è specificato, il valore predefinito è (1,1).
shaijut,

40

Espandi il tuo database, espandi la tua tabella fai clic con il pulsante destro del mouse sulla tabella e seleziona il design dal menu a discesa. Sembra così

Ora vai su Proprietà colonna sotto di essa scorri verso il basso e trova la Specifica di identità , espanderla e troverai Is Identity renderlo Sì. Ora scegli Incremento identità proprio sotto di esso per dare il valore che desideri incrementare in esso. inserisci qui la descrizione dell'immagine


1
sembra che sarebbe la risposta corretta per me, solo fare del tipo di dati un int non farebbe il trucco, giusto?
Drewdin

10

Forse mi manca qualcosa, ma perché non funziona con l'oggetto SEQUENCE? Non è quello che stai cercando?

Esempio:

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

Quando si fa riferimento a squence in un comando INSERT, basta usare:

NEXT VALUE FOR blah.blahsequence

Maggiori informazioni e opzioni per SEQUENCE


Questa soluzione è quella giusta se ti preoccupi dell'ordine temporale delle righe inserite, perché a IDENTITYvolte salti che lasciano degli spazi vuoti, allora è tornato a riempirli di nuovo. Quindi IDENTITYnon garantisce SEMPRE le condizioni
incrmenet

1
@Martin Smith Oops, non ho seguito il link, errore mio! Mi sono così abituato a MS-SQL che non ha certe caratteristiche che a volte dimentico che ci sono versioni più recenti che supportano più cose. Eliminerò il mio commento poiché potrebbe essere fonte di confusione ... Se espresso in modo più generale, rimane comunque valido: potrebbe essere che stia usando una versione / versione di RDBMS che non supporta gli oggetti SEQUENCE - soprattutto perché alla domanda è stata posta solo una pochi mesi dopo il rilascio di SQL Server 2012;)
Paul Groke

1
@FindOut_Quran Sei sicuro che le lacune nelle colonne IDENTITY siano colmate? Ho lavorato solo con SQL Server 2005 dove non l'ho mai visto accadere - le lacune rimangono semplicemente. E sarei piuttosto sorpreso di vederlo accadere su qualsiasi RDBMS perché una tale funzione sarebbe una strana combinazione di "non libero" (per quanto riguarda le prestazioni) e "non desiderabile" (almeno nella maggior parte delle applicazioni).
Paul Groke,

@PaulGroke Sì, ne sono sicuro. Puoi provare a utilizzare una transazione per inserire 1000 righe, quindi eseguire il rollback. Il valore di idenetità si confonderà. Prova a inserire più migliaia di righe e esegui il commit / o il rollback. Noterai che a volte si
colma

@FindOut_Quran Non riesco a vedere come questo possa accadere. Le colonne IDENTITY MS SQL utilizzano un semplice contatore che viene eseguito il seeding a un valore definibile dall'utente e quindi incrementato di un valore definibile dall'utente. Puoi anche interrogare e reimpostare il contatore. L'unico modo in cui riesco a vedere questo accada è quando le transazioni simultanee commettono "fuori servizio". Vale a dire che la transazione che per prima ha battuto il contatore IDENTITY si impegna dopo un'altra transazione. In tal caso avresti un gap di breve durata che poi si colmerebbe. Ciò è necessario per evitare collisioni. Tuttavia, il contatore IDENTITÀ non sarà mai saltato indietro.
Paul Groke,

7

Quando si utilizza Tipo di dati: int è possibile selezionare la riga di cui si desidera ottenere l'autoincremento e passare al tag delle proprietà della colonna. Lì puoi impostare l'identità su "sì". Qui è anche possibile modificare il valore iniziale per l'autoincremento. Spero di poter aiutare;)


dove si trovano le proprietà della colonna?

2

Ho avuto questo problema in cui avevo già creato la tabella e non potevo cambiarla senza abbandonare la tabella, quindi quello che ho fatto è stato: (Non sono sicuro di quando lo hanno implementato, ma lo avevo in SQL 2016)

Fare clic con il tasto destro sulla tabella in Esplora oggetti:

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

Quindi esegui la modifica della sceneggiatura detta da Josien; scorrere fino alla fine dove si CREATE TABLEtrova, trovare la chiave primaria e aggiungere IDENTITY(1,1)alla fine prima della virgola. Esegui script.

Anche lo script DROP e CREATE mi è stato utile a causa di questo problema. (Che gestisce lo script generato.)


1

Fai attenzione come se volessi che gli elementi ID fossero contigiosi o meno. Poiché l'ID SQLSERVER può saltare di 1000.

Esempio: prima di riavviare ID = 11 dopo il riavvio, inserire una nuova riga nella tabella, quindi l'id sarà 1012.


1

È possibile utilizzare la parola chiave IDENTITYcome tipo di dati nella colonna insieme al PRIMARY KEYvincolo durante la creazione della tabella.
ex:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Qui il primo '1' indica il valore iniziale e il secondo '1' è il valore incrementale.


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

MS SQL Server utilizza la parola chiave IDENTITY per eseguire una funzione di incremento automatico.

Nell'esempio sopra, il valore iniziale per IDENTITY è 1 e aumenterà di 1 per ogni nuovo record.

Suggerimento: per specificare che la colonna "Personid" dovrebbe iniziare dal valore 10 e aumentare di 5, modificarla in IDENTITÀ (10,5).

Per inserire un nuovo record nella tabella "Persone", NON dovremo specificare un valore per la colonna "Personid" (un valore univoco verrà aggiunto automaticamente):


0

Se la tabella è già popolata non è possibile modificare una colonna in colonna IDENTITÀ o convertirla in colonna non IDENTITÀ. Dovresti esportare tutti i dati, quindi puoi cambiare il tipo di colonna in IDENTITÀ o viceversa e quindi importare nuovamente i dati. So che è un processo doloroso, ma credo che non ci siano alternative se non l'uso della sequenza come menzionato in questo post.


1
Puoi usare ALTER TABLE ... SWITCHsolo per cambiare i metadati senza toccare i dati. ad es. Vedi come impostare l'incremento automatico dopo aver creato una tabella senza perdita di dati?
Martin Smith,

1
Il processo menzionato nel link fornito dall'utente comporta il trasferimento dei dati nella tabella temporanea e viceversa, il che è in accordo con la mia dichiarazione sopra. Se sbaglio, forniscimi un esempio funzionante.
Softec,

1
C'è un esempio funzionante nel link. Non c'è "trasferimento dei dati nella tabella temporanea e viceversa". `ALTER TABLE ... SWITCH` è solo una modifica dei metadati. Non sposta alcun dato.
Martin Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.