2012-06-12 20 views
336

Come si aumenta automaticamente la chiave primaria in una tabella di database di SQL Server, ho dato un'occhiata al forum ma non riesco a vedere come.Chiave primaria di incremento automatico in SQL Server Management Studio 2012

Ho visto le proprietà ma non riesco a vedere un'opzione, ho visto una risposta in cui si va alla proprietà della specifica Identity e si imposta su yes e si imposta l'incremento Identity su 1, ma quella sezione è grigiata fuori e non posso cambiare il no a si.

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

+4

È il tipo di dati della colonna chiave è int? – Rab

+0

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

risposta

524

Assicurarsi che il tipo di dati della colonna Key è int e quindi impostando l'identità manualmente, come immagine mostra

enter image description here

O basta eseguire 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 ID non è l'unica colonna della tabella

immagine di FIFO di riferimento

+12

Solo un po 'di correzione: la proprietà 'IDENTITY' può essere applicata a qualsiasi tipo di dati numerici (quindi potrebbe essere' tinyint', 'smallint',' int', 'bigint',' numerico', 'decimale'), l'unico vincolo è che non può rappresentare un numero frazionario (quindi ** non può essere ** 'float' o' real', né 'numerico' o' decimale' * con scala diversa da zero *) e ofc, il le specifiche di identità dovrebbero essere compatibili con il tipo di dati selezionato. – Pred

+1

Il lavoro, a condizione che non ci siano chiavi esterne, ecc. –

+3

Volevo solo aggiungere, se hai già impostato un valore predefinito sulla colonna Identity, la dicitura (È identità) rimane disattivata. Rimuovi il valore predefinito e diventa nuovamente disponibile. – CDspace

79

È necessario espandere la sezione Identità per esporre l'incremento e il seme.

enter image description here

Edit: ho pensato che avresti un tipo di dati integer, non char (10). Che è ragionevole direi e validi quando ho postato questa risposta

+2

Il 'sì' è disattivato in quanto è' char (10) '(dal commento appena pubblicato) –

+0

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

+0

durante la creazione di una nuova tabella ho usato l'identità della chiave primaria 'BookID int'non ho specificato sia il seed che l'incremento, è quello buona pratica ? perché vedo documentazione in [MSDN] (https://msdn.microsoft.com/en-us/library/ms186775.aspx) Se nessuno dei due è specificato, il valore predefinito è (1,1). – stom

124

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

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

Il IDENTITY proprietà si auto-incremento della colonna dal numero 1 (Si noti che il tipo di dati della colonna deve essere un numero intero.) Se si desidera aggiungerlo a una colonna esistente, utilizzare un comando ALTER TABLE.

Edit:
testato un po ', e non riesco a trovare un modo per modificare le proprietà di identità tramite la finestra delle proprietà della colonna per varie tabelle. Immagino che se vuoi creare una colonna con una colonna Identity, devi usare un comando ALTER TABLE.

+0

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

+0

questa sintassi creare tabella è ** ** buona pratica come consigliato dal autore di [questo] (http://stackoverflow.com/a/4862427/2218697) posta nei commenti, la speranza aiuta qualcuno. – stom

6

Quando si utilizza Data Type: int è possibile selezionare la riga a cui si desidera eseguire l'autoincrementamento 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 poterti aiutare;)

+0

dove si trovano le proprietà della colonna? –

25

Espandi il tuo database, espandi il tuo tavolo con il tasto destro del mouse sul tuo tavolo e seleziona design dal menu a discesa. ITlooks like this

Passare proprietà della colonna al di sotto di esso scorrere verso il basso e trovano identità specifica, si espandono e si troveranno è l'identità rendono Sì. Ora scegli Incremento di identità subito sotto di esso da il valore che vuoi incrementare in esso. enter image description here

+1

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

+0

risposta eccellente! – usefulBee

6

Forse mi manca qualcosa ma perché questo non funziona con l'oggetto SEQUENCE? Non è questo 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 l'squence nel dire un comando INSERT basta usare:

NEXT VALUE FOR blah.blahsequence 

Maggiori informazioni e le opzioni per SEQUENCE

+0

Questa soluzione è quella giusta, se vi preoccupate per l'ordine temporale di righe inserite, perché 'IDENTITY' a volte salta lasciare spazi vuoti, allora è di nuovo per colmare quelle lacune di nuovo. Quindi 'IDENTITY' non garantisce SEMPRE condizioni incrmenet –

+1

@Martin Smith Oops, non ha seguito il link, il mio errore! Sono così abituato a MS-SQL che non ha alcune funzionalità che a volte dimentico che ci sono versioni più recenti che supportano più cose. Cancellerò il mio commento poiché potrebbe essere confuso ... Se espresso in modo più generale rimane valido anche se: potrebbe essere che sta usando una marca/versione RDBMS che non supporta gli oggetti SEQUENCE - specialmente dal momento che la domanda è stata posta solo a pochi mesi dopo il rilascio di SQL Server 2012;) –

+1

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

-1

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

+0

È possibile utilizzare 'ALTER TABLE ... SWITCH' per passare semplicemente ai metadati senza dover toccare i dati. per esempio. Vedi [come impostare incremento automatico dopo la creazione di un tavolo senza alcuna perdita di dati?] (Http://stackoverflow.com/q/6084572/73226) –

+0

processo di cui al link fornito da voi comporta il trasferimento dei dati alla tabella temporanea e ritorno che è d'accordo con la mia affermazione di cui sopra. Se mi sbaglio, per favore forniscimi un esempio funzionante. – Softec

+0

C'è un esempio funzionante nel collegamento. Non c'è "trasferimento dei dati nella tabella temporanea e ritorno". 'ALTER TABLE ... SWITCH' è un cambiamento solo dei metadati. Non sposta alcun dato. –

0

Fai attenzione se vuoi che gli elementi ID siano contigui o meno. Poiché l'ID SQLSERVER può saltare di 1000.

examle: prima ID riavvio = 11 dopo il riavvio, si inserisce nuova riga nella tabella, poi l'id sarà 1012.

0

ho avuto questo problema per il quale avevo già creata la tabella e non poteva cambiarla senza far cadere il tavolo così quello che ho fatto è stato: (Non so quando hanno implementato questo, ma ce l'aveva con SQL 2016)

Fare clic destro sul tavolo Esplora oggetti:

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

Quindi apportare la modifica alla sceneggiatura detta da Josien; scorri fino in fondo dove è lo CREATE TABLE, trova la tua chiave primaria e aggiungi IDENTITY(1,1) alla fine prima della virgola.

Il DROP e CREATE script è stato utile anche per me, perché di this issue. (che lo script generato maniglie.)

Problemi correlati