Vincoli di chiavi primarie ed esternePrimary and Foreign Key Constraints

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Le chiavi primarie e le chiavi esterne sono due tipi di vincoli che possono essere utilizzati per applicare l'integrità dei dati nelle tabelle di SQL ServerSQL Server .Primary keys and foreign keys are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. Si tratta di importanti oggetti di database.These are important database objects.

In questo argomento sono contenute le sezioni seguenti.This topic contains the following sections.

Vincoli di chiave primariaPrimary Key Constraints

Foreign Key ConstraintsForeign Key Constraints

Attività correlateRelated Tasks

Vincoli di chiave primaria Primary Key Constraints

Una tabella include in genere una colonna o una combinazione di colonne i cui valori identificano in modo univoco ogni riga della tabella.A table typically has a column or combination of columns that contain values that uniquely identify each row in the table. Queste colonne sono denominate chiave primaria e garantiscono l'integrità di entità della tabella.This column, or columns, is called the primary key (PK) of the table and enforces the entity integrity of the table. Poiché i vincoli di chiave primaria garantiscono l'univocità dei dati, vengono spesso definiti per la colonna Identity.Because primary key constraints guarantee unique data, they are frequently defined on an identity column.

Quando si specifica un vincolo di chiave primaria per una tabella, Motore di databaseDatabase Engine assicura l'univocità dei dati creando automaticamente un indice univoco per le colonne chiave primaria.When you specify a primary key constraint for a table, the Motore di databaseDatabase Engine enforces data uniqueness by automatically creating a unique index for the primary key columns. Questo indice consente inoltre di accedere rapidamente ai dati quando si utilizza la chiave primaria nelle query.This index also permits fast access to data when the primary key is used in queries. Se un vincolo di chiave primaria viene definito per più colonne, possono essere presenti valori duplicati nella stessa colonna, ma ogni combinazione di valori di tutte le colonne nella definizione del vincolo di chiave primaria deve essere univoca.If a primary key constraint is defined on more than one column, values may be duplicated within one column, but each combination of values from all the columns in the primary key constraint definition must be unique.

Le colonne ProductID e VendorID nella tabella Purchasing.ProductVendor costituiscono un vincolo di chiave primaria composto per la tabella, come illustrato nella figura seguente.As shown in the following illustration, the ProductID and VendorID columns in the Purchasing.ProductVendor table form a composite primary key constraint for this table. Ciò assicura che ogni riga nella tabella ProductVendor presenti una combinazione univoca di ProductID e VendorID.This makes sure that that every row in the ProductVendor table has a unique combination of ProductID and VendorID. e impedisce l'inserimento di righe duplicate.This prevents the insertion of duplicate rows.

Vincolo PRIMARY KEY compostoComposite PRIMARY KEY constraint

  • Una tabella può includere un solo vincolo di chiave primaria.A table can contain only one primary key constraint.

  • Una chiave primaria non può superare 16 colonne e una lunghezza della chiave totale di 900 byte.A primary key cannot exceed 16 columns and a total key length of 900 bytes.

  • Se l'indice viene generato da un vincolo di chiave primaria, nella tabella sarà possibile creare non più di 999 indici non cluster e di 1 indice cluster.The index generated by a primary key constraint cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index.

  • Nel caso in cui per un vincolo di chiave primaria non si specifichi CLUSTERED né NONCLUSTERED, verrà utilizzato automaticamente il valore CLUSTERED se nella tabella non sono specificati indici cluster.If clustered or nonclustered is not specified for a primary key constraint, clustered is used if there no clustered index on the table.

  • Tutte le colonne specificate in un vincolo di chiave primaria devono essere definite come NOT NULL.All columns defined within a primary key constraint must be defined as not null. Se non si specifica il supporto di valori Null, per tutte le colonne coinvolte in un vincolo di chiave primaria viene impostato NOT NULL.If nullability is not specified, all columns participating in a primary key constraint have their nullability set to not null.

  • Se si definisce una chiave primaria in una colonna di tipo CLR definito dall'utente, è necessario che l'implementazione del tipo supporti l'ordinamento binario.If a primary key is defined on a CLR user-defined type column, the implementation of the type must support binary ordering.

Foreign Key Constraints Foreign Key Constraints

Per chiave esterna si intende una colonna o combinazione di colonne utilizzata per stabilire e applicare un collegamento tra i dati di due tabelle per controllare i dati che possono essere archiviati nella tabella della chiave esterna.A foreign key (FK) is a column or combination of columns that is used to establish and enforce a link between the data in two tables to control the data that can be stored in the foreign key table. In un riferimento a una chiave esterna viene creato un collegamento tra tabelle quando le colonne contenenti il valore della chiave primaria per una tabella vengono utilizzate come riferimento dalle colonne di un'altra tabella.In a foreign key reference, a link is created between two tables when the column or columns that hold the primary key value for one table are referenced by the column or columns in another table. Questa colonna diventa una chiave esterna nella seconda tabella.This column becomes a foreign key in the second table.

Nella tabella Sales.SalesOrderHeader , ad esempio, è incluso un collegamento di chiave esterna alla tabella Sales.SalesPerson , in quanto esiste una relazione logica tra gli ordini di vendita e i venditori.For example, the Sales.SalesOrderHeader table has a foreign key link to the Sales.SalesPerson table because there is a logical relationship between sales orders and salespeople. La colonna SalesPersonID della tabella SalesOrderHeader corrisponde alla colonna chiave primaria della tabella SalesPerson .The SalesPersonID column in the SalesOrderHeader table matches the primary key column of the SalesPerson table. La colonna SalesPersonID della tabella SalesOrderHeader rappresenta la chiave esterna alla tabella SalesPerson .The SalesPersonID column in the SalesOrderHeader table is the foreign key to the SalesPerson table. Creando questa relazione di chiave esterna, non è possibile inserire un valore per SalesPersonID nella tabella SalesOrderHeader se non esiste già nella tabella SalesPerson .By creating this foreign key relationship, a value for SalesPersonID cannot be inserted into the SalesOrderHeader table if it does not already exist in the SalesPerson table.

Una tabella può fare riferimento a un massimo di 253 altre tabelle e colonne come chiavi esterne (riferimenti in uscita).A table can reference a maximum of 253 other tables and columns as foreign keys (outgoing references). SQL Server 2016SQL Server 2016 incrementa da 253 a 10.000 il limite per il numero di altre tabelle e colonne che possono fare riferimento alle colonne in una singola tabella (riferimenti in ingresso). increases the limit for the number of other table and columns that can reference columns in a single table (incoming references), from 253 to 10,000. (richiede almeno il livello di compatibilità 130). All'incremento vengono applicate le seguenti restrizioni:(Requires at least 130 compatibility level.) The increase has the following restrictions:

  • I riferimenti di chiave esterna maggiori di 253 sono supportati solo per le operazioni DELETE DML.Greater than 253 foreign key references are only supported for DELETE DML operations. Le operazioni UPDATE e MERGE non sono supportate.UPDATE and MERGE operations are not supported.

  • Una tabella con un riferimento di chiave esterna a se stessa è comunque limitata a 253 riferimenti di chiave esterna.A table with a foreign key reference to itself is still limited to 253 foreign key references.

  • I riferimenti di chiave esterna maggiori di 253 non sono attualmente disponibili per gli indici columnstore, le tabelle con ottimizzazione per la memoria, Estensione database o tabelle di chiave esterna partizionate.Greater than 253 foreign key references are not currently available for columnstore indexes, memory-optimized tables, Stretch Database, or partitioned foreign key tables.

Indici nei vincoli di chiave esternaIndexes on Foreign Key Constraints

A differenza di quanto avviene per i vincoli di chiave primaria, la creazione di un vincolo di chiave esterna non determina automaticamente la creazione di un indice corrispondente.Unlike primary key constraints, creating a foreign key constraint does not automatically create a corresponding index. La creazione manuale di un indice in una chiave esterna, tuttavia, rappresenta spesso un'operazione utile per i motivi seguenti:However, manually creating an index on a foreign key is often useful for the following reasons:

  • Le colonne chiave esterna vengono in genere utilizzate nei criteri di join quando i dati provenienti da tabelle correlate vengono riuniti in query confrontando le colonne nel vincolo di chiave esterna di una tabella con le colonne chiave primaria o univoca nell'altra tabella.Foreign key columns are frequently used in join criteria when the data from related tables is combined in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. Un indice consente a Motore di databaseDatabase Engine di trovare rapidamente i dati correlati nella tabella della chiave esterna.An index enables the Motore di databaseDatabase Engine to quickly find related data in the foreign key table. La creazione di questo indice, tuttavia, non è un requisito necessario.However, creating this index is not required. È possibile riunire i dati di due tabelle correlate anche se non è stato definito alcun vincolo di chiave primaria o di chiave esterna tra le tabelle, ma una relazione di chiave esterna tra due tabelle indica che le due tabelle sono state ottimizzate per essere riunite in una query che utilizza le chiavi come criteri.Data from two related tables can be combined even if no primary key or foreign key constraints are defined between the tables, but a foreign key relationship between two tables indicates that the two tables have been optimized to be combined in a query that uses the keys as its criteria.

  • Le modifiche apportate ai vincoli di chiave primaria vengono confrontate con i vincoli di chiave esterna nelle tabelle correlate.Changes to primary key constraints are checked with foreign key constraints in related tables.

Integrità referenzialeReferential Integrity

Benché lo scopo primario di un vincolo di chiave esterna consista nel controllare i dati che è possibile archiviare nella tabella della chiave esterna, tale vincolo controlla inoltre le modifiche apportate ai dati nella tabella della chiave primaria.Although the main purpose of a foreign key constraint is to control the data that can be stored in the foreign key table, it also controls changes to data in the primary key table. Se, ad esempio, la riga relativa a un venditore viene eliminata dalla tabella Sales.SalesPerson e l'ID del venditore viene usato per gli ordini di vendita inclusi nella tabella Sales.SalesOrderHeader , viene interrotta l'integrità relazionale tra le due tabelle. Gli ordini di vendita del venditore eliminato risultano isolati (orfani) nella tabella SalesOrderHeader e privi di un collegamento ai dati inclusi nella tabella SalesPerson .For example, if the row for a salesperson is deleted from the Sales.SalesPerson table, and the salesperson's ID is used for sales orders in the Sales.SalesOrderHeader table, the relational integrity between the two tables is broken; the deleted salesperson's sales orders are orphaned in the SalesOrderHeader table without a link to the data in the SalesPerson table.

Un vincolo di chiave esterna impedisce il verificarsi di tale situazioneA foreign key constraint prevents this situation. e applica l'integrità referenziale assicurando che non sia possibile apportare modifiche alla tabella della chiave primaria se tali modifiche annullano il collegamento ai dati della tabella della chiave esterna.The constraint enforces referential integrity by guaranteeing that changes cannot be made to data in the primary key table if those changes invalidate the link to data in the foreign key table. Se si tenta di eliminare la riga in una tabella della chiave primaria oppure di modificare un valore della chiave primaria, l'azione avrà esito negativo se il valore della chiave primaria eliminato o modificato corrisponde a un valore nel vincolo di chiave esterna di un'altra tabella.If an attempt is made to delete the row in a primary key table or to change a primary key value, the action will fail when the deleted or changed primary key value corresponds to a value in the foreign key constraint of another table. Per modificare o eliminare correttamente una riga in un vincolo di chiave esterna, è necessario innanzitutto modificare o eliminare i dati della chiave esterna nella tabella della chiave esterna e collegare quindi la chiave esterna ad altri dati della chiave primaria.To successfully change or delete a row in a foreign key constraint, you must first either delete the foreign key data in the foreign key table or change the foreign key data in the foreign key table, which links the foreign key to different primary key data.

Integrità referenziale di propagazioneCascading Referential Integrity

I vincoli di integrità referenziale di propagazione consentono di definire le operazioni eseguite da Motore di databaseDatabase Engine quando un utente tenta di eliminare o aggiornare una chiave alla quale fa riferimento una chiave esterna.By using cascading referential integrity constraints, you can define the actions that the Motore di databaseDatabase Engine takes when a user tries to delete or update a key to which existing foreign keys point. È possibile definire le azioni di propagazione seguenti.The following cascading actions can be defined.

NO ACTIONNO ACTION
Il Motore di databaseDatabase Engine genera un errore e viene eseguito il rollback dell'operazione di eliminazione o di aggiornamento sulla riga nella tabella padre.The Motore di databaseDatabase Engine raises an error and the delete or update action on the row in the parent table is rolled back.

CASCADECASCADE
Le righe corrispondenti vengono aggiornate o eliminate nella tabella di riferimento quando la riga viene aggiornata o eliminata nella tabella padre.Corresponding rows are updated or deleted in the referencing table when that row is updated or deleted in the parent table. Non è possibile specificare la clausola CASCADE se nella chiave esterna o nella chiave a cui si fa riferimento è presente una colonna timestamp .CASCADE cannot be specified if a timestamp column is part of either the foreign key or the referenced key. Non è possibile specificare ON DELETE CASCADE per una tabella in cui è presente un trigger INSTEAD OF DELETE.ON DELETE CASCADE cannot be specified for a table that has an INSTEAD OF DELETE trigger. Non è possibile specificare ON UPDATE CASCADE per tabelle in cui sono presenti trigger INSTEAD OF UPDATE.ON UPDATE CASCADE cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET NULLSET NULL
Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene aggiornata o eliminata la riga corrispondente nella tabella padre.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated or deleted. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.For this constraint to execute, the foreign key columns must be nullable. Il vincolo non può essere specificato per tabelle in cui sono presenti trigger INSTEAD OF UPDATE.Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

SET DEFAULTSET DEFAULT
Tutti i valori che compongono la chiave esterna vengono impostati sui rispettivi valori predefiniti se viene eliminata o aggiornata la riga corrispondente nella tabella padre.All the values that make up the foreign key are set to their default values if the corresponding row in the parent table is updated or deleted. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti.For this constraint to execute, all foreign key columns must have default definitions. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.If a column is nullable, and there is no explicit default value set, NULL becomes the implicit default value of the column. Il vincolo non può essere specificato per tabelle in cui sono presenti trigger INSTEAD OF UPDATE.Cannot be specified for tables that have INSTEAD OF UPDATE triggers.

È possibile combinare le azioni CASCADE, SET NULL, SET DEFAULT e NO ACTION in tabelle con relazioni referenziali reciproche.CASCADE, SET NULL, SET DEFAULT and NO ACTION can be combined on tables that have referential relationships with each other. Se Motore di databaseDatabase Engine rileva l'azione NO ACTION, l'operazione viene arrestata e viene eseguito il rollback delle azioni CASCADE, SET NULL e SET DEFAULT correlate.If the Motore di databaseDatabase Engine encounters NO ACTION, it stops and rolls back related CASCADE, SET NULL and SET DEFAULT actions. Quando un'istruzione DELETE genera una combinazione di azioni CASCADE, SET NULL, SET DEFAULT e NO ACTION, tutte le azioni CASCADE, SET NULL e SET DEFAULT vengono applicate prima che il Motore di databaseDatabase Engine verifichi l'esistenza di azioni NO ACTION.When a DELETE statement causes a combination of CASCADE, SET NULL, SET DEFAULT and NO ACTION actions, all the CASCADE, SET NULL and SET DEFAULT actions are applied before the Motore di databaseDatabase Engine checks for any NO ACTION.

Trigger e operazioni referenziali di propagazioneTriggers and Cascading Referential Actions

Le operazioni referenziali di propagazione attivano i trigger AFTER UPDATE o AFTER DELETE nel modo seguente:Cascading referential actions fire the AFTER UPDATE or AFTER DELETE triggers in the following manner:

  • Vengono eseguite per prime tutte le operazioni referenziali di propagazione determinate direttamente dall'istruzione DELETE o UPDATE originale.All the cascading referential actions directly caused by the original DELETE or UPDATE are performed first.

  • Se nelle tabelle interessate sono stati definiti trigger AFTER, tali trigger vengono attivati dopo che sono state eseguite tutte le operazioni di propagazione.If there are any AFTER triggers defined on the affected tables, these triggers fire after all cascading actions are performed. L'ordine di attivazione dei trigger è inverso rispetto all'ordine delle operazioni di propagazione.These triggers fire in opposite order of the cascading action. Se in una tabella sono presenti più trigger, tali trigger vengono attivati in ordine casuale a meno che per la tabella non sia stato specificato un primo o un ultimo trigger dedicato.If there are multiple triggers on a single table, they fire in random order, unless there is a dedicated first or last trigger for the table. L'ordine viene specificato usando sp_settriggerorder.This order is as specified by using sp_settriggerorder.

  • Se dalla tabella che rappresenta la destinazione diretta di un'azione UPDATE o DELETE vengono originate più catene di propagazione, l'ordine di attivazione dei rispettivi trigger non è specificato.If multiple cascading chains originate from the table that was the direct target of an UPDATE or DELETE action, the order in which these chains fire their respective triggers is unspecified. Prima che una catena inizi ad attivare i propri trigger è tuttavia necessario che un'altra catena abbia completato l'attivazione di tutti i relativi trigger.However, one chain always fires all its triggers before another chain starts firing.

  • Un trigger AFTER presente nella tabella di destinazione diretta di un'azione UPDATE o DELETE viene attivato indipendentemente dal fatto che influisca o meno su qualsiasi riga.An AFTER trigger on the table that is the direct target of an UPDATE or DELETE action fires regardless of whether any rows are affected. In questo caso, la propagazione non avrà effetti su nessun'altra tabella.There are no other tables affected by cascading in this case.

  • Se uno dei trigger precedenti esegue operazioni UPDATE o DELETE su altre tabelle, tali operazioni possono avviare catene di propagazione secondarieIf any one of the previous triggers perform UPDATE or DELETE operations on other tables, these actions can start secondary cascading chains. che vengono elaborate per un'operazione UPDATE o DELETE alla volta dopo che tutti i trigger di tutte le catene primarie sono stati attivati.These secondary chains are processed for each UPDATE or DELETE operation at a time after all triggers on all primary chains fire. È possibile ripetere il processo in modo ricorsivo per le operazioni UPDATE o DELETE successive.This process may be recursively repeated for subsequent UPDATE or DELETE operations.

  • L'esecuzione di operazioni CREATE, ALTER, DELETE o di altre operazioni DDL (Data Definition Language) nei trigger può comportare l'attivazione dei trigger DDLPerforming CREATE, ALTER, DELETE, or other data definition language (DDL) operations inside the triggers may cause DDL triggers to fire. e la conseguente esecuzione di operazioni DELETE o UPDATE che avviano catene e trigger di propagazione aggiuntivi.This may subsequently perform DELETE or UPDATE operations that start additional cascading chains and triggers.

  • Se in una catena di operazioni referenziali di propagazione si verifica un errore, verrà generato un errore, non verrà attivato alcun trigger AFTER nella catena specifica e verrà eseguito il rollback dell'operazione DELETE o UPDATE che ha creato la catena.If an error is generated inside any particular cascading referential action chain, an error is raised, no AFTER triggers are fired in that chain, and the DELETE or UPDATE operation that created the chain is rolled back.

  • Una tabella in cui è presente un trigger INSTEAD OF non può inoltre includere un clausola REFERENCES che specifica un'operazione di propagazione.A table that has an INSTEAD OF trigger cannot also have a REFERENCES clause that specifies a cascading action. Un trigger AFTER in una tabella di destinazione di un'operazione di propagazione può tuttavia eseguire un'istruzione INSERT, UPDATE o DELETE su un'altra tabella o vista che attiva un trigger INSTEAD OF definito nell'oggetto specifico.However, an AFTER trigger on a table targeted by a cascading action can execute an INSERT, UPDATE, or DELETE statement on another table or view that fires an INSTEAD OF trigger defined on that object.

Nella tabella seguente vengono elencate le attività comuni associate a vincoli di chiave primaria e di chiave esterna.The following table lists the common tasks associated with primary key and foreign key constraints.

AttivitàTask ArgomentoTopic
Viene descritto come creare una chiave primaria.Describes how to create a primary key. Creazione di chiavi primarieCreate Primary Keys
Si descrive come eliminare una chiave primaria.Describes how to delete a primary key. Eliminazione di chiavi primarieDelete Primary Keys
Si descrive come modificare una chiave primaria.Describes how to modify a primary key. Modifica di chiavi primarieModify Primary Keys
Si descrive come creare relazioni di chiave esternaDescribes how to create foreign key relationships Creare relazioni di chiave esternaCreate Foreign Key Relationships
Si descrive come modificare relazioni di chiave esterna.Describes how to modify foreign key relationships. Modifica di relazioni di chiave esternaModify Foreign Key Relationships
Si descrive come eliminare relazioni di chiave esterna.Describes how to delete foreign key relationships. Eliminazione di relazioni di chiave esternaDelete Foreign Key Relationships
Viene descritto come visualizzare le proprietà di chiave esterna.Describes how to view foreign key properties. Visualizzare Proprietà di chiave esternaView Foreign Key Properties
Viene descritto come disabilitare vincoli di chiave esterna per la replica.Describes how to disable foreign key constraints for replication. Disabilitare i vincoli di chiave esterna per la replicaDisable Foreign Key Constraints for Replication
Viene descritto come disabilitare un vincolo di chiave esterna durante l'istruzione INSERT o UPDATE.Describes how to disable foreign key constraints during an INSERT or UPDATE statement. Disabilitazione di vincoli di chiave esterna con le istruzioni INSERT e UPDATEDisable Foreign Key Constraints with INSERT and UPDATE Statements