ALTER TABLE column_constraint (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Specifikuje vlastnosti omezení PRIMARY KEY, CIZÍ KLÍČ, UNIQUE nebo CHECK, které je součástí nové definice sloupce přidané do tabulky pomocí ALTER TABLE.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database, Spravovanou instanci Azure SQL, databázi SQL v Microsoft Fabric

[ CONSTRAINT constraint_name ]   
{   
    [ NULL | NOT NULL ]   
    { 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 )  
}  

Syntaxe pro Microsoft Fabric Warehouse v Microsoft Fabric

[ CONSTRAINT constraint_name ]  
{  
    { PRIMARY KEY | UNIQUE }  
       NONCLUSTERED    
        (column [ ASC | DESC ] [ ,...n ] )  
NOT ENFORCED
    | FOREIGN KEY  
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]  
NOT ENFORCED
}  

Arguments

CONSTRAINT

Určuje začátek definice pro omezení PRIMÁRNÍ KLÍČ, UNIQUE, FOREIGN KEY nebo CHECK.

constraint_name
Je název omezení. Názvy omezení musí dodržovat pravidla pro identifikátory s tím rozdílem, že název nemůže začínat znakem čísla (#). Pokud constraint_name není zadán, je k omezení přiřazen název vygenerovaný systémem.

NULL | NE NULL

Určuje, jestli sloupec může přijímat NULL hodnoty. Sloupce, které nepovolují NULL hodnoty, lze přidat pouze v případě, že mají zadanou výchozí hodnotu. Pokud nový sloupec umožňuje NULL hodnoty a není zadán žádný výchozí, nový sloupec obsahuje NULL pro každý řádek v tabulce. Pokud nový sloupec umožňuje NULL hodnoty a přidá se do nového sloupce výchozí definice, můžete použít možnost WITH VALUES k uložení výchozí hodnoty v novém sloupci pro každý existující řádek v tabulce.

Pokud nový sloupec neumožňuje NULL hodnoty, musí být k novému sloupci přidána definice DEFAULT . Nový sloupec se automaticky načte s výchozí hodnotou v nových sloupcích v každém existujícím řádku.

Když přidání sloupce vyžaduje fyzické změny datových řádků tabulky, například přidání DEFAULT hodnot ke každému řádku, během běhu se na tabulce ALTER TABLE drží zámky. To má vliv na možnost změnit obsah tabulky, když je zámek na místě. Naproti tomu přidání sloupce, který umožňuje NULL hodnoty a nezadá výchozí hodnotu, je pouze operace metadat a nezahrnuje žádné zámky.

Pokud použijete nastavení CREATE TABLEALTER TABLEdatabáze a relace a případně přepíšete hodnotu null datového typu, který se používá v definici sloupce. Doporučujeme, abyste vždy explicitně definovali nekomprimované sloupce jako NULL nebo NOT NULL , pokud používáte uživatelsky definovaný datový typ, aby sloupec mohl používat výchozí hodnotu nullability datového typu. Další informace najdete na webu CREATE TABLE.

PRIMÁRNÍ KLÍČ

Je omezení, které vynucuje integritu entity pro zadaný sloupec nebo sloupce pomocí jedinečného indexu. Pro každou tabulku lze vytvořit pouze jedno omezení PRIMÁRNÍHO KLÍČE.

UNIQUE

Je omezení, které poskytuje integritu entity pro zadaný sloupec nebo sloupce pomocí jedinečného indexu.

CLUSTERED | NECLUSTERED

Určuje, že se clusterovaný nebo neclusterovaný index vytvoří pro omezení PRIMARY KEY nebo UNIQUE. Omezení PRIMÁRNÍHO KLÍČE jsou výchozí pro CLUSTERED. Omezení UNIQUE jsou výchozí pro NONCLUSTERED.

Pokud clusterované omezení nebo index již v tabulce existuje, nelze clusterED zadat. Pokud v tabulce již existuje clusterované omezení nebo index, omezení PRIMÁRNÍHO KLÍČE jsou výchozí na hodnotu NONCLUSTERED.

Sloupce, které jsou typu ntext, text, varchar(max), nvarchar(max), varbinary(max), xml nebo image , nelze zadat jako sloupce indexu.

Ve službě Microsoft Fabric Warehouse v Microsoft Fabric nemá nonclustered žádný vliv.

S FILLFAKTOREM = FILLFACTOR

Určuje, jak by měl databázový stroj zaplnit každou indexovou stránku použitou k uložení dat indexu. Uživatelem zadané hodnoty faktoru výplně můžou být od 1 do 100. Pokud není zadaná hodnota, výchozí hodnota je 0.

Important

Dokumentování WITH FILLFACTOR jako jediná možnost indexu, která se vztahuje na omezení PRIMÁRNÍ KLÍČ nebo UNIQUE, je zachována kvůli zpětné kompatibilitě, ale nebude dokumentována tímto způsobem v budoucích verzích. Další indexové možnosti lze specifikovat v index_option klauzuli .ALTER TABLE

ON { partition_scheme_name(partition_column_name) | filegroup | default }

platí pro: SQL Server 2008 (10.0.x) a novější.

Určuje umístění úložiště indexu vytvořeného pro omezení. Pokud partition_scheme_name zadáte, index se rozdělí a oddíly se mapují na skupiny souborů určené partition_scheme_name. Pokud je zadána skupina souborů , index se vytvoří v pojmenované skupině souborů. Pokud je zadána hodnota Default nebo pokud není vůbec zadáno ZAPNUTO, index se vytvoří ve stejné skupině souborů jako tabulka. Pokud je zapnuto při přidání clusterovaného indexu pro omezení PRIMÁRNÍ KLÍČ nebo UNIQUE, celá tabulka se při vytvoření clusterovaného indexu přesune do zadané skupiny souborů.

V tomto kontextu není výchozí klíčové slovo. Jedná se o identifikátor výchozí skupiny souborů a musí být oddělený, jako v ON default nebo ON [default]. Pokud je zadána výchozí hodnota , QUOTED_IDENTIFIER musí být pro aktuální relaci zapnutá možnost ZAPNUTO. Toto je výchozí nastavení. Další informace najdete v tématu SET QUOTED_IDENTIFIER (Transact-SQL).

NEVYNUCOVÁNO

Omezení primárního klíče, jedinečného klíče a cizího klíče ve službě Microsoft Fabric Warehouse v Microsoft Fabric Warehouse vyžadují nevynucované. Aplikace musí udržovat integritu omezení.

ODKAZY NA CIZÍ KLÍČ

Je omezení, které poskytuje referenční integritu dat ve sloupci. Omezení cizího klíče vyžadují, aby každá hodnota ve sloupci byla v zadaném sloupci v odkazované tabulce.

schema_name
Je název schématu, do kterého patří tabulka odkazovaná omezením CIZÍ KLÍČ.

referenced_table_name
Je tabulka odkazovaná omezením CIZÍ KLÍČ.

ref_column
Je sloupec v závorkách odkazovaných novým omezením CIZÍ KLÍČ.

NA DELETE { NO ACTION | KASKÁDA | SET NULL | SETDEFAULT }

Určuje akci, která se stane s řádky v tabulce, která se změní, pokud tyto řádky mají referenční relaci a odkazovaný řádek se odstraní z nadřazené tabulky. Výchozí hodnota není ŽÁDNÁ AKCE.

ŽÁDNÁ AKCE
Databázový stroj SQL Serveru vyvolá chybu a akce odstranění na řádku v nadřazené tabulce se vrátí zpět.

CASCADE
Odpovídající řádky se odstraní z odkazující tabulky, pokud je tento řádek odstraněn z nadřazené tabulky.

SET NULL
Všechny hodnoty, které tvoří cizí klíč, se nastaví při NULL odstranění odpovídajícího řádku v nadřazené tabulce. Aby bylo možné toto omezení provést, musí mít sloupce cizího klíče hodnotu null.

SET DEFAULT
Při odstranění odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na výchozí hodnoty. Aby bylo toto omezení provedeno, musí mít všechny sloupce cizího klíče výchozí definice. Pokud je sloupec s možnou hodnotou null a neexistuje žádná explicitní výchozí sada hodnot, NULL stane se implicitní výchozí hodnotou sloupce.

Nezadávejte CASCADE, pokud bude tabulka zahrnuta do slučovací publikace, která používá logické záznamy. Další informace o logických záznamech naleznete v tématu Seskupit změny souvisejících řádků s logickými záznamy.

ON DELETE CASCADE nelze definovat, INSTEAD OF pokud aktivační událost ON DELETE již v tabulce, která je změněna.

Například v AdventureWorks2025 databázi ProductVendor má tabulka referenční relaci s tabulkou Vendor . ProductVendor. VendorID cizí klíč odkazuje na Vendor. VendorID primární klíč.

Pokud DELETE je příkaz vykonán na řádku tabulky Vendor a pro .VendorID, je určena akce ProductVendorON DELETE CASCADE, Database Engine zkontroluje jeden nebo více závislých řádků v tabulceProductVendor. Pokud nějaké existují, budou závislé řádky v ProductVendor tabulce kromě řádku odkazovaného v Vendor tabulce odstraněny.

Pokud není zadána ŽÁDNÁ AKCE, databázový stroj vyvolá chybu a vrátí akci odstranění na Vendor řádku, pokud je v tabulce, která na ni odkazuje, alespoň jeden řádek ProductVendor .

NA UPDATE { NO ACTION | KASKÁDA | SET NULL | SETDEFAULT }

Určuje, co se stane s řádky v tabulce změněné, když tyto řádky mají referenční relaci a odkazovaný řádek se aktualizuje v nadřazené tabulce. Výchozí hodnota není ŽÁDNÁ AKCE.

ŽÁDNÁ AKCE
Databázový stroj vyvolá chybu a akce aktualizace na řádku v nadřazené tabulce se vrátí zpět.

CASCADE
Odpovídající řádky se aktualizují v odkazující tabulce, když se tento řádek aktualizuje v nadřazené tabulce.

SET NULL
Všechny hodnoty, které tvoří cizí klíč, se nastaví při NULL aktualizaci odpovídajícího řádku v nadřazené tabulce. Aby bylo možné toto omezení provést, musí mít sloupce cizího klíče hodnotu null.

SET DEFAULT
Při aktualizaci odpovídajícího řádku v nadřazené tabulce jsou všechny hodnoty, které tvoří cizí klíč, nastaveny na výchozí hodnoty. Aby bylo toto omezení provedeno, musí mít všechny sloupce cizího klíče výchozí definice. Pokud je sloupec s možnou hodnotou null a neexistuje žádná explicitní výchozí sada hodnot, NULL stane se implicitní výchozí hodnotou sloupce.

Nezadávejte CASCADE, pokud bude tabulka zahrnuta do slučovací publikace, která používá logické záznamy. Další informace o logických záznamech naleznete v tématu Seskupit změny souvisejících řádků s logickými záznamy.

ON CASCADE UPDATE , NULL, SET nebo SETDEFAULT nelze definovat, pokud na tabulce, která je upravována, již existuje spouštěč MÍSTO ON UPDATE .

Například v AdventureWorks2025 databázi ProductVendor má tabulka referenční relaci s tabulkou Vendor . ProductVendor. VendorID cizí klíč odkazuje na Vendor. VendorID primární klíč.

Pokud UPDATE je příkaz vykonán na řádku tabulky Vendor a je určena ON UPDATE CASCADE akce pro ProductVendor.VendorID, Database Engine zkontroluje jeden nebo více závislých řádků v tabulceProductVendor. Pokud nějaké existují, aktualizuje se kromě řádku odkazovaného v tabulce také závislý řádek v ProductVendorVendor tabulce.

Pokud není zadána ŽÁDNÁ AKCE, databázový stroj vyvolá chybu a vrátí akci aktualizace na Vendor řádku, pokud je v tabulce, která na ni odkazuje, alespoň jeden řádek ProductVendor .

NE PRO REPLIKACI
platí pro: SQL Server 2008 (10.0.x) a novější.

Lze zadat pro omezení cizího klíče a omezení CHECK. Pokud je tato klauzule určena pro omezení, omezení se nevynucuje, když agenti replikace provádějí operace vložení, aktualizace nebo odstranění.

CHECK

Je omezení, které vynucuje integritu domény omezením možných hodnot, které lze zadat do sloupce nebo sloupců.

logical_expression
Je logický výraz použitý v omezení CHECK a vrací hodnotu PRAVDA nebo NEPRAVDA. logical_expression použitá s omezeními CHECK nemůže odkazovat na jinou tabulku, ale může odkazovat na jiné sloupce ve stejné tabulce pro stejný řádek. Výraz nemůže odkazovat na datový typ aliasu.

Remarks

Při přidání omezení CIZÍ KLÍČ nebo CHECK se ověřují všechna existující data pro porušení omezení, pokud není zadána WITH NOCHECK možnost. Pokud dojde k jakémukoli porušení, ALTER TABLE chyba selže a vrátí se chyba. Když se do existujícího sloupce přidá nové omezení PRIMARY KEY nebo UNIQUE, musí být data ve sloupci nebo sloupcích jedinečná. Pokud jsou nalezeny duplicitní hodnoty, ALTER TABLE selže. Tato WITH NOCHECK možnost nemá žádný vliv při přidání omezení PRIMÁRNÍHO KLÍČE nebo JEDINEČNÉ hodnoty.

Každý primární klíč a omezení UNIQUE vygeneruje index. Počet omezení jedinečného a PRIMÁRNÍho klíče nemůže způsobit, že počet indexů v tabulce překročí 999 neclusterovaných indexů a 1 clusterovaný index. Omezení cizího klíče negenerují index automaticky. Sloupce cizího klíče se ale často používají v kritériích spojení dotazů tím, že odpovídají omezení cizího klíče jedné tabulky s primárním nebo jedinečným klíčovým sloupcem nebo sloupci v druhé tabulce. Index sloupců cizího klíče umožňuje databázovému stroji rychle najít související data v tabulce cizího klíče.

Examples

Pro příklady viz ALTER TABLE (Transact-SQL).