Un IDENTITY
vincolo non possono essere aggiunti a una colonna esistente, così come aggiungere questo deve essere il vostro pensiero iniziale. Ci sono due opzioni:
- creare una nuova tabella tra cui una chiave primaria con l'identità e eliminare la tabella esistente
- Creare una nuova colonna di chiave primaria con l'identità e eliminare la colonna esistente 'P_ID'
C'è un terzo modo, che è un approccio migliore per tabelle molto grandi tramite l'istruzione ALTER TABLE...SWITCH
. Vedere Adding an IDENTITY
to an existing column per un esempio di ciascuno. In risposta a questa domanda, se la tabella non è troppo grande, vi consiglio eseguendo i seguenti:
-- Check that the table/column exist and no primary key is already on the table.
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS')
-- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo'
BEGIN
ALTER TABLE PERSONS
ADD P_ID_new int IDENTITY(1, 1)
GO
ALTER TABLE PERSONS
DROP COLUMN P_ID
GO
EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column'
GO
ALTER TABLE PERSONS
ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID)
GO
END
Note: esplicitamente utilizzando la parola chiave CONSTRAINT
il vincolo di chiave primaria viene dato un nome particolare, piuttosto che in base a SQL Server per l'assegnazione automatica di un nome.
Includere solo CLUSTERED
su PRIMARY KEY
se il saldo delle ricerche di un P_ID specifico e la quantità di scrittura superano i vantaggi del clustering della tabella con un altro indice. Vedi Create SQL IDENTITY
as PRIMARY KEY
.
è necessario contrassegnare una risposta come accettata. –