Creare chiavi primarie
Si applica a: SQL Server 2016 (13.x) e versioni successive Database SQL di Azure Istanza gestita di SQL di Azure
È possibile definire una chiave primaria in SQL Server usando SQL Server Management Studio o Transact-SQL. Con la creazione di una chiave primaria, viene creato automaticamente un indice cluster univoco corrispondente. Tuttavia, la chiave primaria può essere specificata come indice non cluster.
Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
Limiti
In una tabella è possibile includere un solo vincolo PRIMARY KEY
.
Tutte le colonne specificate in un vincolo PRIMARY KEY
devono essere definite come NOT NULL
. Se non si specifica che ammette i valori Null, per tutte le colonne coinvolte in un vincolo PRIMARY KEY
viene impostato NOT NULL
.
Autorizzazioni
Per la creazione di una nuova tabella con una chiave primaria è richiesta l'autorizzazione CREATE TABLE
per il database e l'autorizzazione ALTER
per lo schema in cui viene creata la tabella.
Per la creazione di una chiave primaria in una tabella esistente è richiesta l'autorizzazione ALTER
per la tabella.
Usare SQL Server Management Studio
- In Esplora oggetti fare clic con il pulsante destro dl mouse sulla tabella nella quale aggiungere un vincolo univoco e scegliere Progetta.
- In Progettazione tabelle, fare clic sul selettore di riga per la colonna di database che si desidera definire come chiave primaria. Per selezionare più colonne, tenere premuto il tasto CTRL e fare clic sul selettore di riga delle altre colonne.
- Fare clic con il pulsante destro del mouse sul selettore di riga per la colonna e selezionare Imposta chiave primaria.
Attenzione
Per ridefinire la chiave primaria, sarà necessario eliminare tutte le relazioni alla chiave primaria esistente prima di poterne creare una nuova. Verrà visualizzato un messaggio di avviso in cui si notificherà che nel corso del processo le relazioni esistenti verranno eliminate automaticamente.
Una colonna chiave primaria è contrassegnata da un simbolo di chiave primaria nel corrispondente selettore di riga.
Se una chiave primaria è composta da più colonne, è consentita la presenza di valori duplicati in una colonna ma è comunque richiesta l'univocità delle combinazioni di valori tratti da tutte le colonne nella chiave primaria.
Se si definisce una chiave composta, l'ordine delle colonne nella chiave primaria corrisponderà all'ordine delle colonne come visualizzate nella tabella. È comunque possibile modificare l'ordine delle colonne dopo la creazione della chiave primaria. Per altre informazioni, vedere Modifica chiavi primarie.
Usare Transact-SQL
Creare una chiave primaria in una tabella esistente
L'esempio seguente crea una chiave primaria nella colonna TransactionID
nel database AdventureWorks2022
.
ALTER TABLE [Production].[TransactionHistoryArchive]
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID);
Creare una chiave primaria in una nuova tabella
L'esempio seguente crea una tabella e definisce una chiave primaria nella colonna TransactionID
nel database AdventureWorks2022
.
CREATE TABLE [Production].[TransactionHistoryArchive1] (
TransactionID INT IDENTITY(1, 1) NOT NULL,
CONSTRAINT PK_TransactionHistoryArchive1_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
);
Creare una chiave primaria non cluster con un indice cluster separato in una nuova tabella
Nell'esempio seguente viene creata una tabella nel database AdventureWorks2022
con una chiave primaria non cluster nella colonna CustomerID
. Quindi, aggiunge un indice cluster in TransactionID
.
Creare una tabella per aggiungere l'indice cluster.
CREATE TABLE [Production].[TransactionHistoryArchive1] ( CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), TransactionID INT IDENTITY(1, 1) NOT NULL, CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID) );
Ora, aggiungere l'indice cluster.
CREATE CLUSTERED INDEX CIX_TransactionID ON [Production].[TransactionHistoryArchive1] (TransactionID);