Creare relazioni di chiave esterna
Questo argomento descrive come creare relazioni di chiave esterna in SQL Server 2014 usando SQL Server Management Studio o Transact-SQL. Una relazione tra due tabelle consente di stabilire un'associazione tra le righe di una tabella e le righe di un'altra tabella.
Contenuto dell'articolo
Prima di iniziare:
Per creare relazioni di chiave esterna utilizzando:
Prima di iniziare
Limitazioni e restrizioni
Un vincolo di chiave esterna può anche non essere collegato esclusivamente al vincolo di chiave primaria di un'altra tabella. Può infatti essere definito in modo da fare riferimento alle colonne di un vincolo UNIQUE in un'altra tabella.
I valori diversi da NULL immessi nella colonna di un vincolo FOREIGN KEY devono essere presenti nella colonna a cui viene fatto riferimento. In caso contrario, viene restituito un messaggio di errore di violazione della chiave esterna. Per assicurarsi che tutti i valori di un vincolo di chiave esterna composto vengano verificati, specificare NOT NULL in tutte le colonne coinvolte.
I vincoli FOREIGN KEY possono fare riferimento solo a tabelle di un singolo database nello stesso server. L'integrità referenziale tra database diversi deve essere implementata tramite trigger. Per altre informazioni, vedere CREATE TRIGGER (Transact-SQL).
I vincoli FOREIGN KEY possono fare riferimento a un'altra colonna nella stessa tabella. Questo tipo di vincolo viene definito autoreferenziale.
Un vincolo FOREIGN KEY specificato a livello di colonna può includere una sola colonna di riferimento. Il tipo di dati di tale colonna deve essere uguale al tipo di dati della colonna in cui viene definito il vincolo.
Un vincolo FOREIGN KEY specificato a livello di tabella deve includere lo stesso numero di colonne di riferimento di quelle presenti nell'elenco di colonne del vincolo. Il tipo di dati di ogni colonna di riferimento deve inoltre essere uguale a quello della colonna corrispondente nell'elenco di colonne.
Il motore di database non prevede un limite predefinito per il numero di vincoli FOREIGN KEY che possono essere inclusi in una tabella e che fanno riferimento ad altre tabelle o per il numero di vincoli FOREIGN KEY di proprietà di altre tabelle che fanno riferimento a una tabella specifica. Il numero effettivo di vincoli FOREIGN KEY che è possibile usare, tuttavia, è limitato dalla configurazione hardware e dalla progettazione del database e dell'applicazione. È consigliabile evitare che una tabella contenga più di 253 vincoli FOREIGN KEY e che più di 253 vincoli FOREIGN KEY facciano riferimento alla tabella stessa.
I vincoli FOREIGN KEY non vengono applicati nelle tabelle temporanee.
Se si definisce una chiave esterna su una colonna di tipo CLR definito dall'utente, è necessario che l'implementazione del tipo supporti l'ordinamento binario. Per altre informazioni, vedere Tipi CLR definiti dall'utente.
Una colonna di tipo
varchar(max)
può far parte di un vincolo FOREIGN KEY solo se anche la chiave primaria a cui fa riferimento è definita come tipovarchar(max)
.
Sicurezza
Autorizzazioni
Per la creazione di una nuova tabella con una chiave esterna è 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 esterna in una tabella esistente è richiesta l'autorizzazione ALTER per la tabella.
Uso di SQL Server Management Studio
Per creare una relazione di chiave esterna in Progettazione tabelle
In Esplora oggetti fare clic con il pulsante destro del mouse sulla tabella che si troverà sul lato chiave esterna della relazione e scegliere Progetta.
La tabella verrà visualizzata in Progettazione tabelle.
Scegliere Relazioni dal menu Progettazione tabelle.
Nella finestra di dialogo Relazioni chiavi esterne fare clic su Aggiungi.
La relazione viene visualizzata nell'elenco Relazione selezionata con un nome fornito dal sistema nel formato FK_<tablename>_<tablename, dove tablename> è il nome della tabella della chiave esterna.
Fare clic sulla relazione nell'elenco Relazione selezionata .
Fare clic su Specifica tabelle e colonne nella griglia a destra e quindi sul pulsante con i puntini di sospensione ( ... ) a destra della proprietà.
Nella finestra di dialogo Tabelle e colonne selezionare dall'elenco a discesa Chiave primaria la tabella che si troverà sul lato chiave primaria della relazione.
Nella griglia sottostante selezionare le colonne che contribuiranno alla chiave primaria della tabella. Nella cella adiacente alla sinistra di ciascuna colonna selezionare la corrispondente colonna chiave esterna della tabella di chiave esterna.
Progettazione tabelle suggerisce automaticamente un nome da assegnare alla relazione. Per specificare un nome diverso, modificare il contenuto della casella di testo Nome relazione .
Scegliere OK per creare la relazione.
Uso di Transact-SQL
Per creare una chiave esterna in una nuova tabella
In Esplora oggetti connettersi a un'istanza del motore di database.
Sulla barra Standard fare clic su Nuova query.
Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui. Nell'esempio si crea una tabella e si definisce un vincolo di chiave esterna nella colonna
TempID
alla quale fa riferimento la colonnaSalesReasonID
nella tabellaSales.SalesReason
. Le clausole ON DELETE CASCADE e ON UPDATE CASCADE vengono utilizzate per garantire che le modifiche apportate alla tabellaSales.SalesReason
vengano propagate automaticamente alla tabellaSales.TempSalesReason
.USE AdventureWorks2012; GO CREATE TABLE Sales.TempSalesReason (TempID int NOT NULL, Name nvarchar(50), CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID), CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE );GO
Per creare una chiave esterna in una tabella esistente
In Esplora oggetti connettersi a un'istanza del motore di database.
Sulla barra Standard fare clic su Nuova query.
Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui. Nell'esempio si crea una chiave esterna nella colonna
TempID
e si fa riferimento alla colonnaSalesReasonID
nella tabellaSales.SalesReason
.USE AdventureWorks2012; GO ALTER TABLE Sales.TempSalesReason ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE ; GO
Per altre informazioni, vedere ALTER TABLE (Transact-SQL),CREATE TABLE (Transact-SQL) e table_constraint (Transact-SQL).