Creare chiavi primarie

Si applica a: SQL Server 2016 (13.x) e alle sue 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

  1. In Esplora oggetti fare clic con il pulsante destro dl mouse sulla tabella nella quale aggiungere un vincolo univoco e scegliere Progetta.
  2. 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.
  3. 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.

  1. 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)
    );
    
  2. Ora, aggiungere l'indice cluster.

    CREATE CLUSTERED INDEX CIX_TransactionID
    ON [Production].[TransactionHistoryArchive1] (TransactionID);