CREATE TABLE (Transact-SQL)

Crea una nuova tabella in SQL Server 2008 R2.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

CREATE TABLE 
    [ database_name . [ schema_name ] . | schema_name . ] table_name 
    ( { <column_definition> | <computed_column_definition> 
        | <column_set_definition> | [ <table_constraint> ] [ ,...n ] } ) 
    [ ON { partition_scheme_name ( partition_column_name ) | filegroup 
        | "default" } ] 
    [ { TEXTIMAGE_ON { filegroup | "default" } ] 
    [ FILESTREAM_ON { partition_scheme_name | filegroup 
        | "default" } ]
    [ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ] 
    [ NULL | NOT NULL ]
    [ 
        [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
      | [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ] 
    ]
    [ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ] 
    [ SPARSE ] 

<data type> ::= 
[ type_schema_name . ] type_name 
    [ ( precision [ , scale ] | max | 
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ] 

<column_constraint> ::= 
[ CONSTRAINT constraint_name ] 
{     { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        [ 
            WITH FILLFACTOR = fillfactor  
          | WITH ( < index_option > [ , ...n ] ) 
        ] 
        [ ON { partition_scheme_name ( partition_column_name ) 
            | filegroup | "default" } ]
  | [ FOREIGN KEY ] 
        REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
  | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 

<computed_column_definition> ::=
column_name AS computed_column_expression 
[ PERSISTED [ NOT NULL ] ]
[ 
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ 
            WITH FILLFACTOR = fillfactor 
          | WITH ( <index_option> [ , ...n ] )
        ]
    | [ FOREIGN KEY ] 
        REFERENCES referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE } ] 
        [ ON UPDATE { NO ACTION } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
    [ ON { partition_scheme_name ( partition_column_name ) 
        | filegroup | "default" } ]
] 

<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

< table_constraint > ::=
[ CONSTRAINT constraint_name ] 
{ 
    { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        (column [ ASC | DESC ] [ ,...n ] ) 
        [ 
            WITH FILLFACTOR = fillfactor 
           |WITH ( <index_option> [ , ...n ] ) 
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ] 
    | FOREIGN KEY 
        ( column [ ,...n ] ) 
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 
<table_option> ::=
{
    DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
      [ , ...n ] ) ]
}

<index_option> ::=
{ 
    PAD_INDEX = { ON | OFF } 
  | FILLFACTOR = fillfactor 
  | IGNORE_DUP_KEY = { ON | OFF } 
  | STATISTICS_NORECOMPUTE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF} 
  | ALLOW_PAGE_LOCKS ={ ON | OFF} 
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
       [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
       [ , ...n ] ) ]
}
<range> ::= 
<partition_number_expression> TO <partition_number_expression>

Argomenti

  • database_name
    Nome del database in cui viene creata la tabella. Per database_name è necessario specificare il nome di un database esistente. Se l'argomento database_name non viene specificato, il valore predefinito è il database corrente. L'account di accesso per la connessione corrente deve essere associato a un ID utente esistente nel database specificato da database_name. Tale ID utente deve inoltre disporre delle autorizzazioni CREATE TABLE.

  • schema_name
    Nome dello schema a cui appartiene la nuova tabella.

  • table_name
    Nome della nuova tabella. I nomi di tabella devono essere conformi alle regole per gli identificatori. table_name può essere composto da un massimo di 128 caratteri, con l'eccezione dei nomi di tabelle temporanee locali, ovvero i nomi preceduti da un solo simbolo di cancelletto (#), i quali possono includere al massimo 116 caratteri.

  • column_name
    Nome di una colonna della tabella. I nomi di colonna devono essere conformi alle regole per gli identificatori ed essere univoci all'interno della tabella. column_name può contenere fino a 128 caratteri. È possibile omettere column_name per le colonne create con tipo di dati timestamp. Se column_name non è specificato, una colonna timestamp assume per impostazione predefinita il nome timestamp.

  • computed_column_expression
    Espressione che definisce il valore di una colonna calcolata. Una colonna calcolata è una colonna virtuale che non viene archiviata fisicamente nella tabella, a meno che non sia contrassegnata come PERSISTED. Questo tipo di colonna viene calcolata in base a un'espressione che utilizza altre colonne nella stessa tabella. La definizione di una colonna calcolata potrebbe ad esempio essere costo AS prezzo * quantità. L'espressione può essere un nome di colonna non calcolata, una costante, una funzione, una variabile e qualsiasi combinazione di questi elementi uniti da uno o più operatori. L'espressione non può essere una sottoquery o contenere tipi di dati alias.

    È possibile utilizzare le colonne calcolate in elenchi di selezione, clausole WHERE e ORDER BY o in qualsiasi altra posizione in cui è consentito l'utilizzo di espressioni regolari, con le eccezioni seguenti:

    • Una colonna calcolata non può essere utilizzata come definizione di vincolo DEFAULT o FOREIGN KEY o con una definizione di vincolo NOT NULL. È tuttavia possibile utilizzare una colonna calcolata come colonna chiave di un indice o come parte di un vincolo PRIMARY KEY o UNIQUE, a condizione che il valore della colonna sia definito da un'espressione deterministica e che il tipo di dati del risultato sia supportato nelle colonne dell'indice.

      Se, ad esempio, la tabella include le colonne integer a e b, è possibile indicizzare la colonna calcolata a+b, ma non la colonna calcolata a+DATEPART(dd, GETDATE()), poiché in questo secondo caso il valore può cambiare durante le chiamate successive.

    • Non è consentito l'utilizzo di una colonna calcolata come destinazione di un'istruzione INSERT o UPDATE.

    Nota

    Ogni riga di una tabella può includere valori diversi per le colonne correlate a una colonna calcolata. È pertanto possibile che non sia disponibile lo stesso valore per ciascuna riga della colonna calcolata.

    In base alle espressioni utilizzate, il supporto dei valori Null per le colonne calcolate viene determinato automaticamente da Motore di database. Si presuppone che il risultato della maggior parte delle espressioni ammetta valori Null anche se sono presenti solo colonne in cui tali valori non sono ammessi, perché anche i possibili underflow oppure overflow generano risultati NULL. Per stabilire se una colonna calcolata in una tabella ammette o meno i valori Null, utilizzare la funzione COLUMNPROPERTY con la proprietà AllowsNull. Un'espressione che ammette valori Null può essere convertita in un'espressione in cui tali valori non sono ammessi specificando ISNULL con la costante check_expression, dove la costante è un valore non Null che sostituisce qualsiasi risultato NULL. Per le colonne calcolate basate su espressioni di tipo CLR (Common Language Runtime) definito dall'utente è richiesta l'autorizzazione REFERENCES per il tipo.

  • PERSISTED
    Specifica che il Motore di database di SQL Server archivierà fisicamente i valori calcolati nella tabella e aggiornerà i valori in caso di aggiornamento di eventuali altre colonne da cui dipende la colonna calcolata. Quando si contrassegna una colonna calcolata come PERSISTED, è possibile creare un indice deterministico, ma non preciso, in una colonna calcolata. Per ulteriori informazioni, vedere Creazione di indici per le colonne calcolate. Qualsiasi colonna calcolata utilizzata come colonna di partizionamento di una tabella partizionata deve essere contrassegnata in modo esplicito come PERSISTED. L'espressione computed_column_expression deve essere deterministica se si specifica PERSISTED.

  • ON { <partition_scheme> | filegroup | "default" }
    Specifica lo schema di partizione o il filegroup in cui la tabella viene archiviata. Se si specifica <partition_scheme>, la tabella deve essere partizionata e le relative partizioni devono essere archiviate in un set di uno o più filegroup specificati in <partition_scheme>. Se si specifica filegroup, la tabella viene archiviata nel filegroup indicato. Il filegroup deve essere presente nel database. Se si specifica "default" oppure si omette ON, la tabella viene archiviata nel filegroup predefinito. Il meccanismo di archiviazione di una tabella specificato in CREATE TABLE non può essere modificato in seguito.

    È inoltre possibile specificare ON {<partition_scheme> | filegroup | "default"} in un vincolo PRIMARY KEY o UNIQUE. Questi vincoli comportano la creazione di indici. Se si specifica filegroup, l'indice viene archiviato nel filegroup indicato. Se si specifica "default" oppure si omette ON, l'indice viene archiviato nello stesso filegroup della tabella. Se il vincolo PRIMARY KEY o UNIQUE crea un indice cluster, le pagine di dati della tabella vengono archiviate nello stesso filegroup dell'indice. Se si specifica CLUSTERED o se il vincolo crea in altri modi un indice cluster e si specifica uno schema <partition_scheme> diverso dal valore <partition_scheme> o filegroup della definizione della tabella (o viceversa), verrà rispettata solo la definizione del vincolo e gli altri valori verranno ignorati.

    Nota

    In questo contesto default non è una parola chiave, ma un identificatore per il filegroup predefinito e pertanto deve essere delimitato, ad esempio ON "default" oppure ON [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

    Nota

    Dopo avere creato una tabella partizionata, impostare l'opzione LOCK_ESCALATION per la tabella su AUTO. In questo modo è possibile migliorare la concorrenza consentendo ai blocchi di eseguire l'escalation a livello di partizione (HoBT) anziché di tabella. Per ulteriori informazioni, vedere ALTER TABLE (Transact-SQL).

  • TEXTIMAGE_ON { filegroup| "default" }
    Parole chiave che indicano che le colonne di tipo text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) e CLR definito dall'utente (inclusi geometry e geography) devono essere archiviate nel filegroup specificato.

    La parola chiave TEXTIMAGE_ON non è consentita se la tabella non include colonne con valori di grandi dimensioni. Non è possibile specificare TEXTIMAGE_ON se si specifica <partition_scheme>. Se si specifica "default" oppure si omette TEXTIMAGE_ON, le colonne con valori di grandi dimensioni vengono archiviate nel filegroup predefinito. Il tipo di archiviazione per i dati di colonne con valori di grandi dimensioni specificato in CREATE TABLE non può essere modificato in seguito.

    Nota

    In questo contesto default non è una parola chiave, ma un identificatore per il filegroup predefinito e pertanto è necessaria una delimitazione, ad esempio TEXTIMAGE_ON "default" o TEXTIMAGE_ON [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

  • FILESTREAM_ON { partition_scheme_name | filegroup | "default" }
    Specifica il filegroup per i dati FILESTREAM.

    Se la tabella è partizionata e contiene dati FILESTREAM, la clausola FILESTREAM_ON deve essere inclusa e deve specificare uno schema di partizione dei filegroup FILESTREAM che utilizzi la stessa funzione e le stesse colonne di partizione dello schema di partizione per la tabella. In caso contrario, verrà generato un errore.

    Se la tabella non è partizionata, la colonna FILESTREAM non può essere partizionata. I dati FILESTREAM per la tabella devono essere archiviati in un singolo filegroup, specificato nella clausola FILESTREAM_ON.

    Se la tabella non è partizionata e la clausola FILESTREAM_ON non è specificata, viene utilizzato il filegroup FILESTREAM per cui è impostata la proprietà DEFAULT. Se non è presente alcun filegroup FILESTREAM, viene generato un errore.

    • Analogamente a ON e TEXTIMAGE_ON, il valore impostato utilizzando CREATE TABLE per FILESTREAM_ON non può essere modificato, ad eccezione dei casi seguenti:

    • Conversione di un heap in un indice cluster mediante un'istruzione CREATE INDEX. In questo caso è possibile specificare un filegroup FILESTREAM diverso, uno schema di partizione o NULL.

    • Conversione di un indice cluster in un heap mediante un'istruzione DROP INDEX. In questo caso è possibile specificare un filegroup FILESTREAM diverso, uno schema di partizione o il valore "default".

    Per il filegroup nella clausola FILESTREAM_ON <filegroup> o per ogni filegroup FILESTREAM denominato nello schema di partizione deve essere presente un file definito per il filegroup. Tale file deve essere definito utilizzando un'istruzione CREATE DATABASE o ALTER DATABASE. In caso contrario, viene generato un errore.

    Per argomenti correlati a FILESTREAM, vedere Progettazione e implementazione di un'archiviazione FILESTREAM.

  • [ type_schema_name**.** ] type_name
    Specifica il tipo di dati della colonna e lo schema a cui appartiene. I tipi di dati possibili sono i seguenti:

    • Tipo di dati di sistema.

    • Tipo alias basato su un tipo di dati di sistema di SQL Server. Per consentirne l'utilizzo in una definizione di tabella, i tipi di dati alias vengono creati con l'istruzione CREATE TYPE. L'assegnazione NULL o NOT NULL per un tipo di dati alias può essere ignorata durante l'esecuzione dell'istruzione CREATE TABLE. Non è tuttavia possibile modificare l'impostazione della lunghezza. In un'istruzione CREATE TABLE non è possibile specificare la lunghezza per un tipo di dati alias.

    • Tipo CLR definito dall'utente. I tipi CLR definiti dall'utente devono essere creati con l'istruzione CREATE TYPE prima di poterli utilizzare in una definizione di tabella. Per creare una colonna con un tipo CLR definito dall'utente, è richiesta l'autorizzazione REFERENCES per il tipo.

    Se type_schema_name viene omesso, il Motore di database di SQL Server fa riferimento a type_name nell'ordine seguente:

    • Tipo di dati di sistema di SQL Server.

    • Schema predefinito dell'utente corrente nel database corrente.

    • Schema dbo nel database corrente.

  • precision
    Precisione del tipo di dati specificato. Per ulteriori informazioni sui valori di precisione validi, vedere Precisione, scala e lunghezza.

  • scale
    Scala del tipo di dati specificato. Per ulteriori informazioni sui valori di scala validi, vedere Precisione, scala e lunghezza.

  • max
    Si applica solo ai tipi di dati varchar, nvarchar e varbinary per l'archiviazione di 2^31 byte di dati binari e di tipo character e di 2^30 byte di dati Unicode.

  • CONTENT
    Specifica che ogni istanza del tipo di dati xml in column_name può contenere più elementi di livello principale. CONTENT si applica solo al tipo di dati xml ed è possibile specificarlo solo se si specifica anche xml_schema_collection. Se non specificato, CONTENT rappresenta il comportamento predefinito.

  • DOCUMENT
    Specifica che ogni istanza del tipo di dati xml in column_name può contenere un solo elemento di livello principale. DOCUMENT si applica solo al tipo di dati xml ed è possibile specificarlo solo se si specifica anche xml_schema_collection.

  • xml_schema_collection
    Si applica solo al tipo di dati xml per associare una raccolta di XML Schema al tipo. Prima di tipizzare una colonna xml con uno schema, è necessario creare lo schema nel database tramite CREATE XML SCHEMA COLLECTION.

  • DEFAULT
    Specifica il valore assegnato alla colonna quando non viene specificato un valore in modo esplicito durante un inserimento. È possibile applicare le definizioni DEFAULT a qualsiasi colonna, ad eccezione di quelle definite come timestamp o di quelle con la proprietà IDENTITY. Se si specifica un valore predefinito per una colonna di tipo definito dall'utente il tipo deve supportare la conversione implicita da constant_expression nel tipo definito dall'utente. Le definizioni DEFAULT vengono rimosse quando la tabella viene eliminata. È possibile utilizzare come predefinito solo un valore costante, ad esempio una stringa di caratteri, una funzione scalare (una funzione di sistema, definita dall'utente o CLR) oppure un valore NULL. Per mantenere la compatibilità con le versioni precedenti di SQL Server, è possibile assegnare un nome di vincolo a una definizione DEFAULT.

  • constant_expression
    Costante, valore NULL o funzione di sistema utilizzata come valore predefinito della colonna.

  • IDENTITY
    Indica che la nuova colonna è una colonna Identity. Quando si aggiunge una nuova riga alla tabella, Motore di database assegna un valore univoco e incrementale alla colonna. Le colonne Identity vengono in genere utilizzate in combinazione con vincoli PRIMARY KEY come identificatori di riga univoci per la tabella. È possibile assegnare la proprietà IDENTITY a colonne di tipo tinyint, smallint, int, bigint, decimal(p,0) o numeric(p,0). È possibile creare una sola colonna Identity per ogni tabella. Non è consentito utilizzare valori predefiniti associati e vincoli DEFAULT con una colonna Identity. È necessario specificare sia il valore di inizializzazione, sia l'incremento oppure nessuno dei due. In quest'ultimo caso, il valore predefinito è (1,1).

  • seed
    Valore utilizzato per la prima riga caricata nella tabella.

  • increment
    Valore incrementale aggiunto al valore Identity della riga caricata in precedenza.

  • NOT FOR REPLICATION
    Nell'istruzione CREATE TABLE è possibile specificare la clausola NOT FOR REPLICATION per la proprietà IDENTITY, i vincoli FOREIGN KEY e i vincoli CHECK. Se si specifica questa clausola per la proprietà IDENTITY, i valori non vengono incrementati nelle colonne Identity per gli inserimenti eseguiti dagli agenti di replica. Se per un vincolo si specifica questa clausola, il vincolo non viene imposto quando gli agenti di replica eseguono le operazioni di inserimento aggiornamento o eliminazione. Per ulteriori informazioni, vedere Controllo di vincoli, identità e trigger con l'opzione NOT FOR REPLICATION.

  • ROWGUIDCOL
    Indica che la nuova colonna è una colonna GUID di riga. È possibile designare come colonna ROWGUIDCOL una sola colonna di tipo uniqueidentifier per ogni tabella. L'applicazione della proprietà ROWGUIDCOL consente di fare riferimento alla colonna utilizzando $ROWGUID. La proprietà ROWGUIDCOL può essere assegnata solo a una colonna uniqueidentifier. La parola chiave ROWGUIDCOL non è valida se il livello di compatibilità del database è minore o uguale a 65. Per ulteriori informazioni, vedere Livello di compatibilità ALTER DATABASE (Transact-SQL). Le colonne con tipo di dati definito dall'utente non possono essere designate con ROWGUIDCOL.

    La proprietà ROWGUIDCOL non impone l'univocità dei valori archiviati nella colonna e non genera automaticamente valori per le nuove righe inserite nella tabella. Per generare valori univoci per ogni colonna, utilizzare la funzione NEWID o NEWSEQUENTIALID in istruzioni INSERT oppure utilizzare tali funzioni come valore predefinito per la colonna.

  • SPARSE
    Indica che la colonna è di tipo sparse. L'archiviazione delle colonne di tipo sparse è ottimizzata per valori Null. Non è possibile designare le colonne di tipo sparse come NOT NULL. Per ulteriori restrizioni e informazioni relative alle colonne di tipo sparse, vedere Utilizzo di colonne di tipo sparse.

  • FILESTREAM
    Valido solo per colonne varbinary(max). Specifica l'archiviazione FILESTREAM per i dati BLOB varbinary(max).

    Nella tabella deve inoltre essere presente una colonna con tipo di dati uniqueidentifier che dispone dell'attributo ROWGUIDCOL. Questa colonna non deve consentire valori null e deve avere un vincolo a colonna singola UNIQUE o PRIMARY KEY. Il valore GUID per la colonna deve essere specificato da un'applicazione al momento dell'inserimento dei dati o da un vincolo DEFAULT che utilizza la funzione NEWID ().

    Non è possibile eliminare la colonna ROWGUIDCOL, né modificare i vincoli correlati quando per la tabella è stata definita una colonna FILESTREAM. La colonna ROWGUIDCOL può essere eliminata solo dopo l'eliminazione dell'ultima colonna FILESTREAM.

    Quando l'attributo di archiviazione FILESTREAM viene specificato per una colonna, tutti i valori relativi a tale colonna vengono archiviati in un contenitore di dati FILESTREAM nel file system.

  • COLLATE collation_name
    Specifica le regole di confronto per la colonna. Il nome di tali regole può essere un nome di regole di confronto Windows o SQL. collation_name si applica solo alle colonne con tipo di dati char, varchar, text, nchar, nvarchar e ntext. Se non specificato, alla colonna vengono assegnate le regole di confronto del tipo di dati definito dall'utente, se la colonna presenta questo tipo di dati, oppure le regole di confronto predefinite del database.

    Per ulteriori informazioni sui nomi di regole di confronto Windows o SQL, vedere gli argomenti relativi a nome delle regole di confronto di Windows e nome delle regole di confronto SQL.

    Per ulteriori informazioni sulla clausola COLLATE, vedere COLLATE (Transact-SQL).

  • CONSTRAINT
    Parola chiave facoltativa che indica l'inizio di una definizione di vincolo PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY o CHECK. Per ulteriori informazioni, vedere Vincoli.

  • constraint_name
    Nome di un vincolo. I nomi di vincolo devono essere univoci nell'ambito dello schema a cui appartiene la tabella.

  • NULL | NOT NULL
    Indica se i valori NULL sono consentiti nella colonna. La parola chiave NULL non è esattamente un vincolo, ma può essere specificata allo stesso modo di NOT NULL. È possibile specificare NOT NULL per le colonne calcolate solo se si specifica anche PERSISTED.

  • PRIMARY KEY
    Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.

  • UNIQUE
    Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco. Una tabella può includere più vincoli UNIQUE.

  • CLUSTERED | NONCLUSTERED
    Imposta la creazione di un indice cluster o non cluster per il vincolo PRIMARY KEY o UNIQUE. Il valore predefinito per i vincoli PRIMARY KEY è CLUSTERED, mentre per i vincoli UNIQUE è NONCLUSTERED.

    In un'istruzione CREATE TABLE è possibile specificare CLUSTERED per un solo vincolo. Se si specifica CLUSTERED per un vincolo UNIQUE e si specifica anche un vincolo PRIMARY KEY, il valore predefinito di quest'ultimo è NONCLUSTERED.

  • FOREIGN KEY REFERENCES
    Vincolo che assicura l'integrità referenziale dei dati di una o più colonne. È necessario che ogni valore delle colonne sia incluso nelle colonne di riferimento corrispondenti della tabella di riferimento. È possibile fare riferimento a vincoli FOREIGN KEY solo nelle colonne che nella tabella con riferimenti corrispondono a vincoli PRIMARY KEY o UNIQUE e nelle colonne a cui viene fatto riferimento in un indice univoco nella tabella di riferimento. Le chiavi esterne in colonne calcolate devono inoltre essere contrassegnate come PERSISTED.

  • [ schema_name**.**] referenced_table_name]
    Nome della tabella a cui fa riferimento il vincolo FOREIGN KEY e dello schema a cui appartiene.

  • **(**ref_column [ ,... n ] )
    Colonna o elenco di colonne della tabella a cui fa riferimento il vincolo FOREIGN KEY.

  • ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
    Specifica quale azione eseguire sulle righe nella tabella creata, se tali righe includono una relazione referenziale e se la riga a cui viene fatto riferimento viene eliminata dalla tabella padre. Il valore predefinito è NO ACTION.

    • NO ACTION
      Motore di database genera un errore e viene eseguito il rollback dell'operazione di eliminazione sulla riga nella tabella padre.

    • CASCADE
      Le righe corrispondenti vengono eliminate dalla tabella di riferimento se la riga viene eliminata dalla tabella padre.

    • SET NULL
      Tutti i valori che compongono la chiave esterna vengono impostati su NULL se viene eliminata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne di chiavi esterne ammettano valori Null.

    • SET DEFAULT
      Tutti i valori che compongono la chiave esterna vengono impostati sui rispettivi valori predefiniti se viene eliminata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo è necessario che per tutte le colonne di chiavi esterne siano definiti valori predefiniti. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.

    Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici. Per ulteriori informazioni sui record logici, vedere Raggruppamento di modifiche alla righe correlate con record logici.

    Non è possibile specificare ON DELETE CASCADE se nella tabella è già presente un trigger INSTEAD OF per ON DELETE.

    Nel database AdventureWorks2008R2, ad esempio, la tabella ProductVendor include una relazione referenziale con la tabella Vendor. La chiave esterna ProductVendor.BusinessEntityID fa riferimento alla chiave primaria Vendor.BusinessEntityID.

    Se viene eseguita un'istruzione DELETE in una riga della tabella Vendor e viene specificata un'azione ON DELETE CASCADE per ProductVendor.BusinessEntityID, Motore di database verifica se esistono una o più righe dipendenti nella tabella ProductVendor. Le eventuali righe dipendenti individuate nella tabella ProductVendor vengono eliminate insieme alla riga a cui viene fatto riferimento nella tabella Vendor.

    Viceversa, specificando NO ACTION, Motore di database genera un errore ed esegue il rollback dell'azione di eliminazione della riga nella tabella Vendor se almeno una riga della tabella ProductVendor vi fa riferimento.

  • ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
    Specifica l'azione eseguita nelle righe della tabella modificata se tali righe includono una relazione referenziale e la riga a cui viene fatto riferimento è stata aggiornata nella tabella padre. Il valore predefinito è NO ACTION.

    • NO ACTION
      Motore di database genera un errore e viene eseguito il rollback dell'azione di aggiornamento della riga nella tabella padre.

    • CASCADE
      Le righe corrispondenti vengono aggiornate nella tabella di riferimento quando la riga viene aggiornata nella tabella padre.

    • SET NULL
      Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene aggiornata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

    • SET DEFAULT
      Tutti i valori che costituiscono la chiave esterna vengono impostati sui rispettivi valori predefiniti quando viene aggiornata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.

    Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici. Per ulteriori informazioni sui record logici, vedere Raggruppamento di modifiche alla righe correlate con record logici.

    Non è possibile specificare ON UPDATE CASCADE, SET NULL o SET DEFAULT se nella tabella che viene modificata esiste già un trigger INSTEAD OF per ON UPDATE.

    Nel database AdventureWorks2008R2, ad esempio, la tabella ProductVendor presenta una relazione referenziale con la tabella Vendor, ovvero la chiave esterna ProductVendor.BusinessEntity fa riferimento alla chiave primaria Vendor.BusinessEntityID.

    Se in una riga della tabella Vendor viene eseguita un'istruzione UPDATE e si specifica ON UPDATE CASCADE per ProductVendor.BusinessEntityID, Motore di database verifica se sono già presenti una o più righe dipendenti nella tabella ProductVendor. Le eventuali righe dipendenti individuate nella tabella ProductVendor vengono aggiornate insieme alla riga a cui viene fatto riferimento nella tabella Vendor.

    Viceversa, specificando NO ACTION, Motore di database genera un errore ed esegue il rollback dell'azione di aggiornamento della riga nella tabella Vendor se almeno una riga della tabella ProductVendor vi fa riferimento.

  • CHECK
    Vincolo che impone l'integrità di dominio tramite la limitazione dei valori che è possibile inserire in una o più colonne. I vincoli CHECK in colonne calcolate devono inoltre essere contrassegnati come PERSISTED.

  • logical_expression
    Espressione logica che restituisce TRUE o FALSE. L'espressione non può includere tipi di dati alias.

  • column
    Colonna o elenco di colonne, indicate tra parentesi, utilizzate nei vincoli di tabella per indicare le colonne specificate nella definizione del vincolo.

  • [ ASC | DESC ]
    Specifica l'ordinamento della colonna o delle colonne coinvolte nei vincoli di tabella. Il valore predefinito è ASC.

  • partition_scheme_name
    Nome dello schema di partizione che definisce i filegroup a cui verrà eseguito il mapping delle partizioni di una tabella partizionata. Lo schema di partizione deve essere presente nel database.

  • [ partition_column_name**.** ]
    Specifica la colonna in base alla quale verrà partizionata una tabella partizionata. La colonna deve corrispondere a quella specificata nella funzione di partizione utilizzata da partition_scheme_name per quanto riguarda tipo di dati, lunghezza e precisione. Una colonna calcolata utilizzata in una funzione di partizione deve essere contrassegnata in modo esplicito come PERSISTED.

    Nota importanteImportante

    Si consiglia di specificare NOT NULL sulla colonna di partizionamento di tabelle partizionate oppure di tabelle non partizionate che rappresentano origini o destinazioni di operazioni ALTER TABLE...SWITCH. In questo modo, i vincoli CHECK su colonne di partizionamento non devono verificare la presenza di valori Null. Per ulteriori informazioni, vedere Trasferimento efficiente dei dati mediante lo spostamento di partizioni.

  • WITH FILLFACTOR **=**fillfactor
    Specifica la percentuale di riempimento impostata da Motore di database per ogni pagina di indice utilizzata per archiviare i dati dell'indice. I valori di fillfactor specificati dall'utente possono essere compresi tra 1 e 100. Se non viene specificato alcun valore, il valore predefinito è 0. I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.

    Nota importanteImportante

    WITH FILLFACTOR = fillfactor è documentata come unica opzione di indice per i vincoli PRIMARY KEY o UNIQUE solo per motivi di compatibilità con le versioni precedenti. Non sarà più documentata in questo senso nelle versioni future.

  • column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
    Nome del set di colonne. Un set di colonne è una rappresentazione XML non tipizzata che combina tutte le colonne di tipo sparse di una tabella in un output strutturato. Per ulteriori informazioni sui set di colonne, vedere Utilizzo di set di colonne.

  • < table_option> ::=
    Specifica una o più opzioni per la tabella.

  • DATA_COMPRESSION
    Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o l'intervallo di partizioni specificato. Sono disponibili le opzioni seguenti:

    • NONE
      La tabella o le partizioni specificate non vengono compresse.

    • ROW
      La tabella o le partizioni specificate vengono compresse utilizzando la compressione di riga.

    • PAGE
      La tabella o le partizioni specificate vengono compresse utilizzando la compressione di pagina.

    Per ulteriori informazioni sulla compressione, vedere Creazione di tabelle e di indici compressi.

  • ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
    Specifica le partizioni alle quali si applica l'impostazione DATA_COMPRESSION. Se la tabella non è partizionata, l'argomento ON PARTITIONS genererà un errore. Se la clausola ON PARTITIONS non viene specificata, l'opzione DATA_COMPRESSION verrà applicata a tutte le partizioni di una tabella partizionata.

    È possibile specificare <partition_number_expression> nei modi seguenti:

    • Specificare il numero di una partizione, ad esempio ON PARTITIONS (2).

    • Fornire i numeri di partizione per più partizioni singole separati da virgole, ad esempio ON PARTITIONS (1, 5).

    • Specificare sia intervalli, sia singole partizioni, ad esempio ON PARTITIONS (2, 4, 6 TO 8).

    È possibile specificare <range> sotto forma di numeri di partizione separati dalla parola TO, ad esempio ON PARTITIONS (6 TO 8).

    Per impostare tipi diversi di compressione dei dati per partizioni diverse, specificare più volte l'opzione DATA_COMPRESSION, ad esempio:

    WITH 
    (
    DATA_COMPRESSION = NONE ON PARTITIONS (1), 
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), 
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
    )
    
  • <index_option> ::=
    Specifica una o più opzioni per l'indice. Per una descrizione dettagliata di tali opzioni, vedere CREATE INDEX (Transact-SQL).

  • PAD_INDEX = { ON | OFF }
    Se l'opzione è impostata su ON, la percentuale di spazio disponibile specificata da FILLFACTOR viene applicata alle pagine di livello intermedio dell'indice. Se si specifica OFF o se non si specifica un valore FILLFACTOR, le pagine di livello intermedio vengono riempite quasi fino alla capacità massima, lasciando spazio sufficiente per almeno una riga delle dimensioni massime consentite per l'indice, considerando il set di chiavi nelle pagine intermedie. Il valore predefinito è OFF.

  • FILLFACTOR **=**fillfactor
    Specifica una percentuale che indica il livello di riempimento del livello foglia di ogni pagina di indice applicato da Motore di database durante la creazione o la modifica dell'indice. fillfactor deve essere un numero intero compreso tra 1 e 100. Il valore predefinito è 0. I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.

  • IGNORE_DUP_KEY = { ON | OFF }
    Specifica l'errore restituito quando in un'operazione di inserimento si verifica il tentativo di inserire valori di chiave duplicati in un indice univoco. L'opzione IGNORE_DUP_KEY viene applicata solo alle operazioni di inserimento eseguite dopo la creazione o la ricompilazione dell'indice. L'opzione non ha alcun effetto se si esegue CREATE INDEX, ALTER INDEX o UPDATE. Il valore predefinito è OFF.

    • ON
      Viene visualizzato un messaggio di avviso quando i valori di chiave duplicati vengono inseriti in un indice univoco. Avranno esito negativo solo le righe che violano il vincolo di unicità.

    • OFF
      Viene visualizzato un messaggio di errore quando i valori di chiave duplicati vengono inseriti in un indice univoco. Viene eseguito il rollback dell'intera operazione INSERT.

    L'opzione IGNORE_DUP_KEY non può essere impostata su ON per gli indici creati in una vista, negli indici non univoci, negli indici XML, spaziali e filtrati.

    Per visualizzare IGNORE_DUP_KEY, utilizzare sys.indexes.

    Per quanto riguarda la sintassi compatibile con le versioni precedenti, WITH IGNORE_DUP_KEY equivale a WITH IGNORE_DUP_KEY = ON.

  • STATISTICS_NORECOMPUTE = { ON | OFF }
    Se si specifica ON, le statistiche dell'indice non aggiornate non vengono ricalcolate automaticamente. Se si specifica OFF, viene abilitato l'aggiornamento automatico delle statistiche. Il valore predefinito è OFF.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Se si specifica ON, sono consentiti blocchi di riga per l'accesso all'indice. Il Motore di database determina quando utilizzare i blocchi a livello di riga. Se si specifica OFF, i blocchi a livello di riga non vengono utilizzati. Il valore predefinito è ON.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Se si specifica ON, sono consentiti blocchi di pagina per l'accesso all'indice. Il Motore di database determina quando utilizzare blocchi a livello di pagina. Se si specifica OFF, i blocchi a livello di pagina non vengono utilizzati. Il valore predefinito è ON.

Osservazioni

Per ulteriori informazioni sul numero di tabelle, colonne, vincoli e indici consentiti, vedere Specifiche di capacità massima per SQL Server.

Lo spazio in tabelle e indici viene generalmente allocato con incrementi di un extent. Al momento della creazione, agli indici e alle tabelle vengono allocate pagine di extent misti fino a quando non è disponibile un numero di pagine sufficiente per riempire un extent uniforme. In seguito, viene allocato un altro extent ogni volta che gli extent allocati risultano pieni. Per visualizzare un report sulla quantità di spazio allocato e utilizzato da una tabella, eseguire sp_spaceused.

Motore di database non prevede l'applicazione di un ordine particolare per l'impostazione dei valori DEFAULT, IDENTITY, ROWGUIDCOL o dei vincoli di colonna in una definizione di colonna.

Quando viene creata una tabella, l'opzione QUOTED IDENTIFIER viene sempre archiviata con l'impostazione ON nei metadati della tabella, anche se l'opzione viene impostata su OFF quando si crea la tabella.

Tabelle temporanee

È possibile creare tabelle temporanee locali e globali. Le tabelle temporanee locali sono visibili solo nella sessione corrente, mentre quelle globali sono visibili in tutte le sessioni. Non è possibile partizionare le tabelle temporanee.

Anteporre ai nomi delle tabelle temporanee locali un simbolo di cancelletto singolo (#table_name) e a quelli delle tabelle temporanee globali un simbolo di cancelletto doppio (##table_name).

Le istruzioni SQL fanno riferimento alla tabella temporanea utilizzando il valore specificato per table_name nell'istruzione CREATE TABLE, ad esempio:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);

INSERT INTO #MyTempTable VALUES (1);

Se si creano più tabelle temporanee all'interno di una sola stored procedure o di un singolo batch, è necessario che i nomi delle tabelle siano diversi.

Se viene creata una tabella temporanea locale in una stored procedure o in un'applicazione che può essere eseguita contemporaneamente da più utenti, Motore di database deve essere in grado di distinguere le tabelle create dai vari utenti. A tale scopo, Motore di database aggiunge internamente un suffisso numerico a ogni nome di tabella temporanea locale. Il nome completo di una tabella temporanea archiviato nella tabella sysobjects in tempdb è composto dal nome di tabella specificato nell'istruzione CREATE TABLE e dal suffisso numerico generato dal sistema. Per lasciare spazio per tale suffisso, il valore table_name specificato per un nome di tabella temporanea locale non può superare i 116 caratteri.

Le tabelle temporanee vengono eliminate automaticamente quando non sono più comprese nell'ambito, a meno di eliminarle in modo esplicito tramite l'istruzione DROP TABLE:

  • Una tabella temporanea locale creata in una stored procedure viene eliminata automaticamente al termine della stored procedure. È possibile fare riferimento alla tabella da qualsiasi stored procedure nidificata eseguita dalla stored procedure con cui è stata creata la tabella. Non è invece possibile fare riferimento alla tabella dal processo che ha chiamato la stored procedure con cui è stata creata la tabella.

  • Tutte le altre tabelle temporanee locali vengono eliminate automaticamente alla fine della sessione corrente.

  • Le tabelle temporanee globali vengono eliminate automaticamente alla fine della sessione in cui è stata creata la tabella e quando tutte le altre attività non vi fanno più riferimento. L'associazione tra un'attività e una tabella viene mantenuta solo per la durata di una singola istruzione Transact-SQL. Una tabella temporanea globale viene pertanto eliminata dopo il completamento dell'ultima istruzione Transact-SQL che fa attivamente riferimento alla tabella alla fine della sessione di creazione.

Una tabella temporanea locale creata all'interno di una stored procedure o in un trigger può avere lo stesso nome di una tabella temporanea creata prima della chiamata alla stored procedure o al trigger. Se tuttavia una query fa riferimento a una tabella temporanea e sono disponibili due tabelle temporanee con lo stesso nome, non è possibile stabilire in base a quale tabella verrà risolta la query. Anche le stored procedure nidificate possono creare tabelle temporanee con lo stesso nome di una tabella temporanea creata dalla stored procedure chiamante. In questo caso, tuttavia, per fare in modo che le modifiche vengano applicate alla tabella creata nella stored procedure nidificata, è necessario che la struttura della tabella e i nomi di colonna siano identici a quelli della tabella creata nella procedura chiamante, come illustrato nell'esempio seguente.

CREATE PROCEDURE dbo.Test2
AS
    CREATE TABLE #t(x INT PRIMARY KEY);
    INSERT INTO #t VALUES (2);
    SELECT Test2Col = x FROM #t;
GO

CREATE PROCEDURE dbo.Test1
AS
    CREATE TABLE #t(x INT PRIMARY KEY);
    INSERT INTO #t VALUES (1);
    SELECT Test1Col = x FROM #t;
EXEC Test2;
GO

CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;
GO

Set di risultati:

(1 row(s) affected)

Test1Col

-----------

1

(1 row(s) affected)

Test2Col

-----------

2

Quando si creano tabelle temporanee locali o globali, la sintassi dell'istruzione CREATE TABLE supporta le definizioni di vincolo, ad eccezione dei vincoli FOREIGN KEY. Se si specifica un vincolo FOREIGN KEY in una tabella temporanea, l'istruzione restituisce un messaggio di avviso per segnalare che il vincolo è stato ignorato. La tabella viene comunque creata senza i vincoli FOREIGN KEY. Non è possibile fare riferimento a tabelle temporanee nei vincoli FOREIGN KEY.

Se una tabella temporanea viene creata con un vincolo denominato e all'interno dell'ambito di una transazione definita dall'utente, l'istruzione utilizzata per la creazione di tale tabella può essere eseguita da un solo utente alla volta. Se ad esempio una tabella temporanea con un vincolo di chiave primaria denominato viene creata tramite una stored procedure, quest'ultima non può essere eseguita da più utenti contemporaneamente.

Tabelle partizionate

Prima di creare una tabella partizionata con CREATE TABLE, è necessario creare una funzione di partizione per specificare la modalità di partizionamento della tabella. Una funzione di partizione viene creata tramite CREATE PARTITION FUNCTION. In secondo luogo, è necessario creare uno schema di partizione per specificare i filegroup di destinazione delle partizioni indicate dalla funzione di partizione. Uno schema di partizione viene creato tramite CREATE PARTITION SCHEME. Per le tabelle partizionate non è possibile posizionare i vincoli PRIMARY KEY o UNIQUE in filegroup diversi. Per ulteriori informazioni, vedere Tabelle e indici partizionati.

Vincoli PRIMARY KEY

  • Una tabella può includere un solo vincolo PRIMARY KEY.

  • Se l'indice viene generato da un vincolo PRIMARY KEY, nella tabella sarà possibile creare non più di 999 indici non cluster e di 1 indice cluster.

  • Nel caso in cui per un vincolo PRIMARY KEY non si specifichi CLUSTERED né NONCLUSTERED, verrà utilizzato automaticamente il valore CLUSTERED se per i vincoli UNIQUE non sono specificati indici cluster.

  • Tutte le colonne specificate in un vincolo PRIMARY KEY devono essere definite come NOT NULL. Se non si specifica il supporto di valori Null, per tutte le colonne coinvolte in un vincolo PRIMARY KEY viene impostato 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. Per ulteriori informazioni, vedere Tipi CLR definiti dall'utente.

Vincoli UNIQUE

  • Se per un vincolo UNIQUE non si specifica CLUSTERED né NONCLUSTERED, il valore predefinito è NONCLUSTERED.

  • Ogni vincolo UNIQUE genera un indice. Il numero di vincoli UNIQUE non deve generare un numero di indici della tabella maggiore di 999, in caso di indici non cluster, e di 1, in caso di indici cluster.

  • Se si definisce un vincolo UNIQUE in una colonna di tipo CLR definito dall'utente, è necessario che l'implementazione del tipo supporti l'ordinamento binario o basato su operatore. Per ulteriori informazioni, vedere Tipi CLR definiti dall'utente.

Vincoli FOREIGN KEY

  • 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.

  • I vincoli FOREIGN KEY vengono applicati alla colonna precedente, a meno che non vengano specificate colonne di origine.

  • 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 ulteriori 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.

  • La clausola REFERENCES di un vincolo FOREIGN KEY 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.

  • La clausola REFERENCES di un vincolo FOREIGN KEY 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.

  • Non è possibile specificare CASCADE, SET NULL o SET DEFAULT se una colonna di tipo timestamp fa parte della chiave esterna o della chiave a cui si fa riferimento.

  • È possibile combinare le azioni CASCADE, SET NULL, SET DEFAULT e NO ACTION in tabelle con relazioni referenziali reciproche. Se Motore di database rileva l'azione NO ACTION, l'operazione viene arrestata e viene eseguito il rollback delle azioni CASCADE, SET NULL e SET DEFAULT correlate. 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 Motore di database verifichi l'esistenza di azioni NO ACTION.

  • 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 utilizzare, tuttavia, è limitato dalla configurazione hardware e dalla progettazione del database e dell'applicazione. È consigliabile che una tabella contenga non più di 253 vincoli FOREIGN KEY e che venga fatto riferimento a tale tabella da una massimo di 253 vincoli FOREIGN KEY. Il limite effettivo potrebbe variare a seconda dell'applicazione e della configurazione hardware. Nella progettazione di database e applicazioni è opportuno valutare i costi correlati all'applicazione dei vincoli FOREIGN KEY.

  • I vincoli FOREIGN KEY non vengono applicati nelle tabelle temporanee.

  • I vincoli FOREIGN KEY possono fare riferimento solo alle colonne di vincoli PRIMARY KEY o UNIQUE della tabella a cui si fa riferimento o alle colonne in un indice univoco di tale tabella.

  • 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 ulteriori 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 tipo varchar(max).

Definizioni DEFAULT

  • Una colonna può contenere una sola definizione DEFAULT.

  • Una definizione DEFAULT può includere valori costanti, funzioni, funzioni senza parametri SQL-92 o valori NULL. Nella tabella seguente sono illustrati le funzioni senza parametri e i valori predefiniti corrispondenti restituiti durante un'istruzione INSERT.

    Funzione senza parametri SQL-92

    Valore restituito

    CURRENT_TIMESTAMP

    Data e ora correnti.

    CURRENT_USER

    Nome dell'utente che esegue un inserimento.

    SESSION_USER

    Nome dell'utente che esegue un inserimento.

    SYSTEM_USER

    Nome dell'utente che esegue un inserimento.

    USER

    Nome dell'utente che esegue un inserimento.

  • L'argomento constant_expression di una definizione DEFAULT non può fare riferimento a un'altra colonna della tabella o ad altre tabelle, viste o stored procedure.

  • Non è possibile creare definizioni DEFAULT in colonne con tipo di dati timestamp o in colonne con una proprietà IDENTITY.

  • Non è possibile creare definizioni DEFAULT per colonne con tipo di dati alias se tale tipo di dati è associato a un oggetto predefinito.

Vincoli CHECK

  • Una colonna può contenere un numero qualsiasi di vincoli CHECK e la condizione può includere più espressioni logiche unite tramite gli operatori AND e OR. Più vincoli CHECK per una colonna vengono convalidati nell'ordine di creazione.

  • La condizione di ricerca deve restituire un'espressione booleana e non può fare riferimento a un'altra tabella.

  • Un vincolo CHECK a livello di colonna può fare riferimento solo alla colonna vincolata, mentre un vincolo CHECK a livello di tabella può fare riferimento solo alle colonne della stessa tabella.

    Le regole e i vincoli CHECK svolgono la stessa funzione di convalida dei dati durante l'esecuzione delle istruzioni INSERT e UPDATE.

  • Quando per una o più colonne sono definiti una regola e uno o più vincoli CHECK, vengono valutate tutte le restrizioni.

  • Non è possibile definire vincoli CHECK per colonne di tipo text, ntext o image.

Informazioni aggiuntive sui vincoli

  • L'istruzione DROP INDEX non consente di eliminare un indice creato per un vincolo. Per eliminare il vincolo, è necessario utilizzare l'istruzione ALTER TABLE. Un indice creato per un vincolo specifico e da esso utilizzato può essere ricompilato tramite l'istruzione ALTER INDEX.

  • I nomi di vincolo devono essere conformi alle regole per gli identificatori, con la sola eccezione che il nome non può iniziare con il simbolo di cancelletto (#). Se constraint_name viene omesso, al vincolo viene assegnato un nome generato dal sistema. Il nome del vincolo viene indicato nei messaggi di errore relativi alle violazioni di vincolo.

  • Quando in un'istruzione INSERT, UPDATE o DELETE viene violato un vincolo, l'istruzione viene interrotta. Con l'impostazione OFF per SET XACT_ABORT, tuttavia, la transazione continua a essere elaborata se l'istruzione fa parte di una transazione esplicita. Se l'impostazione di SET XACT_ABORT è ON, viene eseguito il rollback dell'intera transazione. È inoltre possibile utilizzare l'istruzione ROLLBACK TRANSACTION con la definizione di transazione eseguendo un controllo con la funzione di sistema **@@**ERROR.

  • Con ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, sono consentiti blocchi a livello di riga, di pagina e di tabella per l'accesso all'indice. Il Motore di database sceglie il tipo di blocco più appropriato e può eseguire l'escalation del blocco dal livello di riga o pagina al livello di tabella. Per ulteriori informazioni, vedere Escalation blocchi (Motore di database). Se ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, sono consentiti solo blocchi a livello di tabella per l'accesso all'indice. Per ulteriori informazioni sulla configurazione della granularità dei blocchi per un indice, vedere Personalizzazione dei blocchi per un indice.

  • Se una tabella include vincoli FOREIGN KEY o CHECK e trigger, le condizioni di vincolo vengono valutate prima dell'esecuzione del trigger.

Per visualizzare un report per una tabella e le relative colonne, utilizzare sp_help o sp_helpconstraint. Per rinominare una tabella, utilizzare sp_rename. Per visualizzare un report per le viste e le stored procedure che dipendono da una tabella, utilizzare sys.dm_sql_referenced_entities e sys.dm_sql_referencing_entities.

Regole per il supporto di valori Null all'interno di una definizione di tabella

L'impostazione del supporto di valori Null per una colonna determina se la colonna ammette o meno valori Null (NULL) come dati. NULL non equivale né a zero né a uno spazio vuoto, ma indica che non è stata immessa alcuna voce oppure che è stato specificato un valore NULL esplicito e in genere implica che il valore è sconosciuto o non applicabile.

Quando si crea o si modifica una tabella con l'istruzione CREATE TABLE o ALTER TABLE, le impostazioni del database e della sessione influiscono ed eventualmente sono prioritarie sull'impostazione del supporto di valori Null per il tipo di dati in una definizione di colonna. È consigliabile definire sempre in modo esplicito una colonna come NULL o NOT NULL per le colonne non calcolate oppure, se si utilizza un tipo di dati definito dall'utente, consentire nella colonna l'utilizzo dell'impostazione predefinita relativa al supporto di valori Null per tale tipo di dati. Le colonne di tipo sparse devono consentire sempre valori Null.

Se non si specifica in modo esplicito il supporto di valori Null per una colonna, saranno valide le regole indicate nella tabella seguente.

Tipo di dati della colonna

Regola

Tipo di dati alias

Motore di database utilizza l'impostazione del supporto di valori Null specificata in fase di creazione del tipo di dati. Per determinare l'impostazione predefinita relativa al supporto di valori Null del tipo di dati, utilizzare sp_help.

Tipo CLR definito dall'utente

Il supporto dei valori Null viene stabilito in base alla definizione della colonna.

Tipo di dati fornito dal sistema

Se il tipo di dati fornito dal sistema prevede una sola opzione, questa ha la precedenza. I tipi di dati timestamp devono essere NOT NULL.

Quando sono presenti impostazioni di sessione specificate su ON tramite SET:

  • Con ANSI_NULL_DFLT_ON = ON viene assegnato il valore NULL.

  • Con ANSI_NULL_DFLT_OFF = ON viene assegnato il valore NOT NULL.

  • Quando sono presenti impostazioni del database configurate tramite ALTER DATABASE:

  • Con ANSI_NULL_DEFAULT_ON = ON viene assegnato il valore NULL.

  • Con ANSI_NULL_DEFAULT_OFF = ON viene assegnato il valore NOT NULL.

  • Per visualizzare le impostazioni del database per ANSI_NULL_DEFAULT, utilizzare la vista del catalogo sys.databases

Quando per la sessione non è impostata alcuna opzione ANSI_NULL_DFLT e per il database è impostato il valore predefinito (ANSI_NULL_DEFAULT è OFF), viene assegnato il valore predefinito NOT NULL.

Nel caso di una colonna calcolata, l'impostazione del supporto di valori Null viene sempre determinata automaticamente dal Motore di database. Per individuare l'impostazione relativa al supporto di valori Null per questo tipo di colonna, utilizzare la funzione COLUMNPROPERTY con la proprietà AllowsNull.

Nota

Per il driver ODBC di SQL Server e il provider Microsoft OLE DB per SQL Server l'impostazione predefinita dell'opzione ANSI_NULL_DFLT_ON è ON. Gli utenti di ODBC e OLE DB possono configurare questa impostazione nelle origini dati ODBC oppure tramite le proprietà o gli attributi di connessione impostati dall'applicazione.

Compressione dei dati

Le tabelle di sistema non possono essere abilitate per la compressione. Se non specificato diversamente, quando si crea una tabella la compressione dei dati è impostata su NONE. Se si specifica un elenco di partizioni o una partizione non compresa nell'intervallo, viene generato un errore. Per ulteriori informazioni sulla compressione dei dati, vedere Creazione di tabelle e di indici compressi.

Per valutare il modo in cui la modifica dello stato di compressione influirà su una tabella, un indice o una partizione, utilizzare la stored procedure sp_estimate_data_compression_savings.

Autorizzazioni

Sono richieste l'autorizzazione CREATE TABLE per il database e l'autorizzazione ALTER per lo schema in cui viene creata la tabella.

Se una colonna nell'istruzione CREATE TABLE è definita con un tipo CLR definito dall'utente, è necessario che l'utente sia il proprietario del tipo o disponga dell'autorizzazione REFERENCES.

Se a una colonna nell'istruzione CREATE TABLE è associata una raccolta di XML Schema, è necessario che l'utente sia il proprietario della raccolta di XML Schema o disponga dell'autorizzazione REFERENCES.

Esempi

A. Utilizzo di vincoli PRIMARY KEY

Nell'esempio seguente viene illustrata la definizione di colonna per un vincolo PRIMARY KEY con un indice cluster nella colonna BusinessEntityID della tabella Employee nel database di esempio AdventureWorks2008R2 (il nome del vincolo viene assegnato dal sistema).

BusinessEntityID int
PRIMARY KEY CLUSTERED

B. Utilizzo di vincoli FOREIGN KEY

I vincoli FOREIGN KEY vengono utilizzati per fare riferimento a un'altra tabella. Le chiavi esterne possono essere chiavi a colonna singola o a più colonne. Nell'esempio seguente viene illustrato un vincolo FOREIGN KEY a colonna singola nella tabella SalesOrderHeader che fa riferimento alla tabella SalesPerson. Per un vincolo FOREIGN KEY a colonna singola è sufficiente specificare solo la clausola REFERENCES.

SalesPersonID int NULL
REFERENCES SalesPerson(BusinessEntityID)

È inoltre possibile utilizzare la clausola FOREIGN KEY in modo esplicito per ridefinire l'attributo di colonna. Si noti che il nome della colonna non deve essere identico in entrambe le tabelle.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(BusinessEntityID)

I vincoli con chiavi a più colonne vengono creati come vincoli di tabella. La tabella SpecialOfferProduct del database AdventureWorks2008R2 include un vincolo PRIMARY KEY a più colonne. Nell'esempio seguente viene illustrato come fare riferimento a questa chiave da un'altra tabella. Il nome di vincolo esplicito è facoltativo.

CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail FOREIGN KEY
 (ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)

C. Utilizzo di vincoli UNIQUE

I vincoli UNIQUE vengono utilizzati per imporre l'univocità di colonne di chiave non primaria. Nell'esempio seguente viene applicata una restrizione per specificare che la colonna Name della tabella Product deve essere univoca.

Name nvarchar(100) NOT NULL
UNIQUE NONCLUSTERED

D. Utilizzo di definizioni DEFAULT

I valori predefiniti forniscono un valore (tramite le istruzioni INSERT e UPDATE) nel caso in cui non ne viene specificato alcuno. Il database AdventureWorks2008R2 potrebbe, ad esempio, includere una tabella di ricerca con un elenco dei vari ruoli professionali che possono essere assegnati ai dipendenti della società. Nella colonna destinata alla descrizione di ogni ruolo professionale, si potrebbe utilizzare una stringa di caratteri predefinita per fornire una descrizione nel caso in cui questa non venga immessa in modo esplicito.

DEFAULT 'New Position - title not formalized yet'

Oltre alle costanti, le definizioni DEFAULT possono includere funzioni. Per ottenere la data corrente per una voce, è possibile utilizzare l'esempio seguente:

DEFAULT (getdate())

È inoltre possibile migliorare l'integrità dei dati tramite un'analisi di funzioni senza parametri. Per tenere traccia dell'utente che ha inserito una riga, utilizzare la funzione senza parametri per USER. Non racchiudere le funzioni senza parametri tra parentesi.

DEFAULT USER

E. Utilizzo di vincoli CHECK

Nell'esempio seguente viene illustrata l'applicazione di una restrizione ai valori immessi nella colonna CreditRating della tabella Vendor. Al vincolo non viene assegnato un nome.

CHECK (CreditRating >= 1 and CreditRating <= 5)

Nell'esempio seguente viene illustrato un vincolo denominato con una restrizione basata su modello per i dati di tipo character immessi in una colonna di una tabella.

CONSTRAINT CK_emp_id CHECK (emp_id LIKE 
'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' 
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')

Nell'esempio seguente viene specificato che i valori devono essere inclusi in un elenco specifico o essere conformi a un modello specificato.

CHECK (emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]')

F. Visualizzazione della definizione completa della tabella

Nell'esempio seguente vengono illustrate le definizioni di tabella complete con tutte le definizioni dei vincoli per la tabella PurchaseOrderDetail creata nel database AdventureWorks2008R2. Per l'esecuzione dell'esempio, lo schema della tabella viene modificato in dbo.

CREATE TABLE dbo.PurchaseOrderDetail
(
    PurchaseOrderID int NOT NULL
        REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
    LineNumber smallint NOT NULL,
    ProductID int NULL 
        REFERENCES Production.Product(ProductID),
    UnitPrice money NULL,
    OrderQty smallint NULL,
    ReceivedQty float NULL,
    RejectedQty float NULL,
    DueDate datetime NULL,
    rowguid uniqueidentifier ROWGUIDCOL  NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid()),
    ModifiedDate datetime NOT NULL 
        CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (getdate()),
    LineTotal  AS ((UnitPrice*OrderQty)),
    StockedQty  AS ((ReceivedQty-RejectedQty)),
    CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber
               PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
               WITH (IGNORE_DUP_KEY = OFF)
) 
ON PRIMARY;

G. Creazione di una tabella con una colonna xml tipizzata in una raccolta di XML Schema

Nell'esempio seguente viene creata una tabella con una colonna xml tipizzata nella raccolta di XML Schema HRResumeSchemaCollection. La parola chiave DOCUMENT specifica che ogni istanza del tipo di dati xml in column_name può contenere un solo elemento di livello principale.

USE AdventureWorks2008R2;
GO
CREATE TABLE HumanResources.EmployeeResumes 
   (LName nvarchar(25), FName nvarchar(25), 
    Resume xml( DOCUMENT HumanResources.HRResumeSchemaCollection) );

H. Creazione di una tabella partizionata

Nell'esempio seguente viene creata una funzione di partizione per suddividere una tabella o indice in quattro partizioni. Viene quindi creato uno schema di partizione per specificare i filegroup in cui posizionare ognuna delle quattro partizioni. Infine viene creata una tabella che utilizza tale schema di partizione. In questo esempio si presuppone che i filegroup siano già presenti nel database.

CREATE PARTITION FUNCTION myRangePF1 (int)
    AS RANGE LEFT FOR VALUES (1, 100, 1000) ;
GO

CREATE PARTITION SCHEME myRangePS1
    AS PARTITION myRangePF1
    TO (test1fg, test2fg, test3fg, test4fg) ;
GO

CREATE TABLE PartitionTable (col1 int, col2 char(10))
    ON myRangePS1 (col1) ;
GO

Sulla base dei valori della colonna col1 di PartitionTable, le partizioni vengono assegnate nei modi seguenti.

Filegroup

test1fg

test2fg

test3fg

test4fg

Partizione

1

2

3

4

Valori

col 1 <= 1

col1 > 1 AND col1 <= 100

col1 > 100 AND col1 <= 1,000

col1 > 1000

I. Utilizzo del tipo di dati uniqueidentifier in una colonna

Nell'esempio seguente viene creata una tabella con una colonna uniqueidentifier. Il vincolo PRIMARY KEY viene utilizzato per evitare che gli utenti inseriscano valori duplicati nella tabella, mentre la funzione NEWSEQUENTIALID() nel vincolo DEFAULT fornisce i valori per le nuove righe. La proprietà ROWGUIDCOL viene applicata alla colonna uniqueidentifier in modo che sia possibile farvi riferimento tramite la parola chiave $ROWGUID.

CREATE TABLE dbo.Globally_Unique_Data
    (guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
    Employee_Name varchar(60)
    CONSTRAINT Guid_PK PRIMARY KEY (guid) );

J. Utilizzo di un'espressione per una colonna calcolata

Nell'esempio seguente viene illustrato l'utilizzo di un'espressione ((low + high)/2) per calcolare la colonna calcolata myavg.

CREATE TABLE dbo.mytable 
    ( low int, high int, myavg AS (low + high)/2 ) ;

K. Creazione di una colonna calcolata basata su una colonna di tipo definito dall'utente

Nell'esempio seguente viene creata una tabella con una colonna di tipo definito dall'utente utf8string presupponendo che l'assembly del tipo e il tipo stesso siano già stati creati nel database corrente. Viene definita una seconda colonna basata sul tipo utf8string e viene quindi utilizzato il metodo ToString() di type(class)utf8string per calcolare un valore per la colonna.

CREATE TABLE UDTypeTable 
    ( u utf8string, ustr AS u.ToString() PERSISTED ) ;

L. Utilizzo della funzione USER_NAME per una colonna calcolata

Nell'esempio seguente viene utilizzata la funzione USER_NAME() nella colonna myuser_name.

CREATE TABLE dbo.mylogintable
    ( date_in datetime, user_id int, myuser_name AS USER_NAME() ) ;

M. Creazione di una tabella con una colonna FILESTREAM

Nell'esempio seguente viene creata una tabella con una colonna FILESTREAMPhoto. Se in una tabella sono presenti una o più colonne FILESTREAM, tale tabella deve includere anche una colonna ROWGUIDCOL.

CREATE TABLE dbo.EmployeePhoto
    (
    EmployeeId int NOT NULL PRIMARY KEY
    ,Photo varbinary(max) FILESTREAM NULL
    ,MyRowGuidColumn uniqueidentifier NOT NULL ROWGUIDCOL
        UNIQUE DEFAULT NEWID()
    );

N. Creazione di una tabella che utilizza la compressione di riga

Nell'esempio seguente viene creata una tabella che utilizza la compressione di riga.

CREATE TABLE dbo.T1 
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = ROW);

Per ulteriori esempi sulla compressione dei dati, vedere Creazione di tabelle e di indici compressi.

O. Creazione di una tabella con colonne di tipo sparse e un set di colonne

Negli esempi seguenti viene illustrato come creare una tabella con una colonna di tipo sparse e una tabella con due colonne di tipo sparse e un set di colonne. Negli esempi viene utilizzata la sintassi di base. Per esempi più complessi, vedere Utilizzo di colonne di tipo sparse e Utilizzo di set di colonne.

Nell'esempio viene creata una tabella con una colonna di tipo sparse.

CREATE TABLE dbo.T1
    (c1 int PRIMARY KEY,
    c2 varchar(50) SPARSE NULL ) ;

In questo esempio viene creata una tabella con due colonne di tipo sparse e un set di colonne denominato CSet.

CREATE TABLE T1
    (c1 int PRIMARY KEY,
    c2 varchar(50) SPARSE NULL,
    c3 int SPARSE NULL,
    CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ) ;