Creare relazioni di chiave esternaCreate Foreign Key Relationships

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

Per il contenuto relativo alle versioni precedenti di SQL Server, vedere Creare relazioni di chiave esterna.For content related to previous versions of SQL Server, see Create Foreign Key Relationships.

In questo argomento si illustra come creare relazioni di chiave esterna in SQL Server 2017SQL Server 2017 tramite SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.This topic describes how to create foreign key relationships in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. Una relazione tra due tabelle consente di stabilire un'associazione tra le righe di una tabella e le righe di un'altra tabella.You create a relationship between two tables when you want to associate rows of one table with rows of another.

Prima di iniziare Before You Begin! Limitazioni e restrizioniLimits and Restrictions

  • 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.A foreign key constraint does not have to be linked only to a primary key constraint in another table; it can also be defined to reference the columns of a UNIQUE constraint in another table.

  • 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.When a value other than NULL is entered into the column of a FOREIGN KEY constraint, the value must exist in the referenced column; otherwise, a foreign key violation error message is returned. Per assicurarsi che tutti i valori di un vincolo di chiave esterna composto vengano verificati, specificare NOT NULL in tutte le colonne coinvolte.To make sure that all values of a composite foreign key constraint are verified, specify NOT NULL on all the participating columns.

  • I vincoli FOREIGN KEY possono fare riferimento solo a tabelle di un singolo database nello stesso server.FOREIGN KEY constraints can reference only tables within the same database on the same server. L'integrità referenziale tra database diversi deve essere implementata tramite trigger.Cross-database referential integrity must be implemented through triggers. Per altre informazioni, vedere CREATE TRIGGER (Transact-SQL).For more information, see CREATE TRIGGER (Transact-SQL).

  • I vincoli FOREIGN KEY possono fare riferimento a un'altra colonna nella stessa tabella.FOREIGN KEY constraints can reference another column in the same table. Questo tipo di vincolo viene definito autoreferenziale.This is referred to as a self-reference.

  • Un vincolo FOREIGN KEY specificato a livello di colonna può includere una sola colonna di riferimento.A FOREIGN KEY constraint specified at the column level can list only one reference column. Il tipo di dati di tale colonna deve essere uguale al tipo di dati della colonna in cui viene definito il vincolo.This column must have the same data type as the column on which the constraint is defined.

  • 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.A FOREIGN KEY constraint specified at the table level must have the same number of reference columns as the number of columns in the constraint column list. Il tipo di dati di ogni colonna di riferimento deve inoltre essere uguale a quello della colonna corrispondente nell'elenco di colonne.The data type of each reference column must also be the same as the corresponding column in the column list.

  • Il Motore di databaseDatabase Engine 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.The Motore di databaseDatabase Engine does not have a predefined limit on either the number of FOREIGN KEY constraints a table can contain that reference other tables, or the number of FOREIGN KEY constraints that are owned by other tables that reference a specific table. Il numero effettivo di vincoli FOREIGN KEY che è possibile usare, tuttavia, è limitato dalla configurazione hardware e dalla progettazione del database e dell'applicazione.Nevertheless, the actual number of FOREIGN KEY constraints that can be used is limited by the hardware configuration and by the design of the database and application. 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 per le operazioni DELETE e UPDATE DML.Greater than 253 foreign key references are supported for DELETE and UPDATE DML operations. Le operazioni MERGE non sono supportate.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 o l'estensione database.Greater than 253 foreign key references are not currently available for columnstore indexes, memory-optimized tables, or Stretch Database.

  • I vincoli FOREIGN KEY non vengono applicati nelle tabelle temporanee.FOREIGN KEY constraints are not enforced on temporary tables.

  • 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.If a foreign key is defined on a CLR user-defined type column, the implementation of the type must support binary ordering. Per altre informazioni, vedere Tipi CLR definiti dall'utente.For more information, see CLR User-Defined Types.

  • 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 tipo varchar(max).A column of type varchar(max) can participate in a FOREIGN KEY constraint only if the primary key it references is also defined as type varchar(max).

PermissionsPermissions

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.Creating a new table with a foreign key requires CREATE TABLE permission in the database and ALTER permission on the schema in which the table is being created.

Per la creazione di una chiave esterna in una tabella esistente è richiesta l'autorizzazione ALTER per la tabella.Creating a foreign key in an existing table requires ALTER permission on the table.

Creare una relazione di chiave esterna in Progettazione tabelleCreate a foreign key relationship in Table Designer

Utilizzo di SQL Server Management StudioUsing SQL Server Management Studio

  1. 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.In Object Explorer, right-click the table that will be on the foreign-key side of the relationship and click Design.

    La tabella verrà aperta in Progettazione tabelle.The table opens in Table Designer.

  2. Scegliere Relazioni dal menu Progettazione tabelle.From the Table Designer menu, click Relationships.

  3. Nella finestra di dialogo Relazioni chiavi esterne fare clic su Aggiungi.In the Foreign-key Relationships dialog box, click Add.

    La relazione verrà visualizzata nell'elenco Relazione selezionata con un nome specificato dal sistema nel formato FK_<nometabella><nometabella>, dove nometabella è il nome della tabella di chiave esterna.The relationship appears in the Selected Relationship list with a system-provided name in the format FK<tablename>_<tablename>, where tablename is the name of the foreign key table.

  4. Fare clic sulla relazione nell'elenco Relazione selezionata .Click the relationship in the Selected Relationship list.

  5. Fare clic su Specifica tabelle e colonne nella griglia a destra, quindi sui puntini di sospensione () a destra della proprietà.Click Tables and Columns Specification in the grid to the right and click the ellipses () to the right of the property.

  6. 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.In the Tables and Columns dialog box, in the Primary Key drop-down list, choose the table that will be on the primary-key side of the relationship.

  7. Nella griglia sottostante selezionare le colonne che contribuiranno alla chiave primaria della tabella.In the grid beneath, choose the columns contributing to the table's primary key. Nella cella adiacente alla sinistra di ciascuna colonna selezionare la corrispondente colonna chiave esterna della tabella di chiave esterna.In the adjacent grid cell to the left of each column, choose the corresponding foreign-key column of the foreign-key table.

    Progettazione tabelle suggerisce automaticamente un nome da assegnare alla relazione.Table Designer suggests a name for the relationship. Per specificare un nome diverso, modificare il contenuto della casella di testo Nome relazione .To change this name, edit the contents of the Relationship Name text box.

  8. Scegliere OK per creare la relazione.Choose OK to create the relationship.

Creare una chiave esterna in una nuova tabellaCreate a foreign key in a new table

Utilizzo di Transact-SQLUsing Transact-SQL

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute. Nell'esempio si crea una tabella e si definisce un vincolo di chiave esterna nella colonna TempID alla quale fa riferimento la colonna SalesReasonID nella tabella Sales.SalesReason .The example creates a table and defines a foreign key constraint on the column TempID that references the column SalesReasonID in the Sales.SalesReason table. Le clausole ON DELETE CASCADE e ON UPDATE CASCADE vengono utilizzate per garantire che le modifiche apportate alla tabella Sales.SalesReason vengano propagate automaticamente alla tabella Sales.TempSalesReason .The ON DELETE CASCADE and ON UPDATE CASCADE clauses are used to ensure that changes made to Sales.SalesReason table are automatically propagated to the Sales.TempSalesReason table.

    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    
    

Creare una chiave esterna in una tabella esistenteCreate a foreign key in an existing table

Utilizzo di Transact-SQLUsing Transasct-SQL

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute. Nell'esempio si crea una chiave esterna nella colonna TempID e si fa riferimento alla colonna SalesReasonID nella tabella Sales.SalesReason.The example creates a foreign key on the column TempID and references the column SalesReasonID in the Sales.SalesReason table.

    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).For more information, see ALTER TABLE (Transact-SQL), CREATE TABLE (Transact-SQL), and table_constraint (Transact-SQL).