Udostępnij za pośrednictwem


ALTER TABLE table_constraint (Transact-SQL)

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceWarehouse w Microsoft FabricSQL database in Microsoft Fabric

Użyj ALTER TABLE, aby określić właściwości PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK ograniczenie lub DEFAULT definicji dodawanej do tabeli przy użyciu ALTER TABLE (Transact-SQL).

Transact-SQL konwencje składni

Syntax

[ 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 ]   
    | CONNECTION
        ( { node_table TO node_table } 
          [ , {node_table TO node_table }]
          [ , ...n ]
        )
        [ ON DELETE { NO ACTION | CASCADE } ]
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}  

Arguments

CONSTRAINT

Określa początek definicji PRIMARY KEYdla ograniczenia DEFAULT, UNIQUE, FOREIGN KEYlub CHECK .

nazwa_ograniczenia

Nazwa ograniczenia. Nazwy ograniczeń muszą być zgodne z regułami dla identyfikatorów, z tą różnicą, że nazwa nie może zaczynać się od znaku numeru (#). Jeśli nie podasz constraint_nameparametru , system przypisuje wygenerowaną nazwę do ograniczenia.

KLUCZ PODSTAWOWY

Ograniczenie wymuszające integralność jednostki dla określonej kolumny lub kolumn przy użyciu unikatowego indeksu. Dla każdej tabeli można utworzyć tylko jedno PRIMARY KEY ograniczenie.

UNIQUE

Ograniczenie zapewniające integralność jednostki dla określonej kolumny lub kolumn przy użyciu unikatowego indeksu.

KLASTROWANE | NIEKLASTROWANE

Określa, że indeks klastrowany lub nieklastrowany jest tworzony dla PRIMARY KEY ograniczenia lub UNIQUE . PRIMARY KEY ograniczenia domyślne to CLUSTERED. UNIQUE ograniczenia domyślne to NONCLUSTERED.

Jeśli ograniczenie klastrowane lub indeks już istnieje w tabeli, nie można określić .CLUSTERED Jeśli ograniczenie klastrowane lub indeks już istnieje w tabeli, PRIMARY KEY ograniczenia są domyślnie ustawione na NONCLUSTERED.

Nie można określić kolumn, które są typu ntext, text, varchar(max), nvarchar(max), varbinary(max), xml lub image data types jako kolumny dla indeksu.

kolumna

Kolumna lub lista kolumn określonych w nawiasach używanych w nowym ograniczeniu.

[ ASC | OPIS]

Określa kolejność sortowania kolumn lub kolumn uczestniczących w ograniczeniach tabeli. Wartość domyślna to rosnąca kolejność sortowania (ASC).

Z WYPEŁNIENIEM = WYPEŁNIENIEM

Określa, jak pełna Database Engine powinna sprawić, że każda strona indeksu będzie używana do przechowywania danych indeksu. Wartości fillfactor określone przez użytkownika mogą należeć do zakresu od 1 do 100. Jeśli nie określisz wartości, wartość domyślna to 0.

W celu zapewnienia zgodności z poprzednimi wersjami ta dokumentacja zawiera WITH FILLFACTOR = <fillfactor> jako jedyną opcję indeksu, która ma zastosowanie do PRIMARY KEY ograniczeń lub UNIQUE . Ta składnia nie zostanie udokumentowana w przyszłych wersjach. Inne opcje indeksu można określić w klauzuli index_option .ALTER TABLE

ON { partition_scheme_name(partition_column_name) | filegroup| "default" }

Applies to: SQL Server 2008 (10.0.x) i nowsze wersje.

Określa lokalizację przechowywania indeksu utworzonego dla ograniczenia. Jeśli określisz partition_scheme_name, indeks jest partycjonowany, a partycje są mapowane na grupy plików, które partition_scheme_name określa. Jeśli określisz grupę plików, indeks zostanie utworzony w nazwie filegroup. Jeśli określisz wartość domyślną lub nie określisz ON w ogóle, indeks zostanie utworzony w tej samej grupie plików co tabela. Jeśli określisz ON , kiedy dodasz indeks klastrowany dla PRIMARY KEY ograniczenia lub UNIQUE , cała tabela zostanie przeniesiona do określonej grupy plików podczas tworzenia klastrowanego indeksu.

W tym kontekście wartość domyślna nie jest słowem kluczowym; jest to identyfikator domyślnej grupy plików i musi być rozdzielany, tak jak w obszarze ON"default" lub ON[default]. Jeśli określisz wartość domyślnąQUOTED_IDENTIFIER, opcja musi być ON dostępna dla bieżącej sesji. Jest to ustawienie domyślne.

ODWOŁANIA DO KLUCZY OBCYCH

Ograniczenie zapewniające integralność referencyjną danych w kolumnie. FOREIGN KEY Ograniczenia wymagają, aby każda wartość w kolumnie istniała w określonej kolumnie w tabeli, do których odwołuje się odwołanie.

referenced_table_name

Tabela przywoływane przez FOREIGN KEY ograniczenie.

ref_column

Kolumna lub lista kolumn w nawiasach, do których odwołuje się nowe FOREIGN KEY ograniczenie.

PO USUNIĘCIU { BRAK AKCJI | CASCADE | USTAW WARTOŚĆ NULL | USTAW WARTOŚĆ DOMYŚLNĄ }

Określa, jaka akcja ma miejsce w wierszach w tabeli, którą zmieniasz, jeśli te wiersze mają relację referencyjną i usuniesz przywoływany wiersz z tabeli nadrzędnej. Wartość domyślna to NO ACTION.

BRAK AKCJI

SQL Server Database Engine zgłasza błąd i cofa akcję usuwania w wierszu w tabeli nadrzędnej.

CASCADE

Usuwa odpowiednie wiersze z tabeli odwołującej się, jeśli usuniesz ten wiersz z tabeli nadrzędnej.

USTAW NULL

Ustawia wszystkie wartości tworzące klucz obcy do NULL po usunięciu odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, kolumny klucza obcego muszą mieć wartość null.

USTAW DOMYŚLNE

Ustawia wszystkie wartości składające się z klucza obcego na wartości domyślne po usunięciu odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, wszystkie kolumny klucza obcego muszą mieć definicje domyślne. Jeśli kolumna jest dopuszczana do wartości null i nie ma jawnego zestawu wartości domyślnych, NULL staje się niejawną wartością domyślną kolumny.

Nie określaj CASCADE , czy tabela jest zawarta w publikacji scalanej, która używa rekordów logicznych. Aby uzyskać więcej informacji na temat rekordów logicznych, zobacz Grupowanie zmian w powiązanych wierszach z rekordami logicznymi.

Nie można zdefiniować ON DELETE CASCADE , czy INSTEAD OF wyzwalacz ON DELETE już istnieje w tabeli, którą zmieniasz.

Na przykład w AdventureWorks2025 bazie danych ProductVendor tabela ma relację odwołania z tabelą Vendor . Klucz ProductVendor.VendorID obcy odwołuje się do klucza podstawowego Vendor.VendorID .

Jeśli wykonasz instrukcję DELETE wiersza w tabeli Vendor i określisz akcję ON DELETE CASCADE dla ProductVendor.VendorID, Database Engine sprawdza co najmniej jeden wiersz zależny w tabeli ProductVendor. Jeśli istnieją, wiersze zależne w ProductVendor tabeli są usuwane oprócz wiersza, do którego odwołuje się Vendor tabela.

Z drugiej strony, jeśli określisz NO ACTION, Database Engine zgłosi błąd i wycofa akcję usuwania w wierszu Vendor, gdy istnieje co najmniej jeden wiersz w tabeli ProductVendor odwołującej się do niego.

PODCZAS AKTUALIZACJI { BRAK AKCJI | CASCADE | USTAW WARTOŚĆ NULL | USTAW WARTOŚĆ DOMYŚLNĄ }

Określa, jaka akcja dzieje się z wierszami w tabeli, które są zmieniane, gdy te wiersze mają relację referencyjną i aktualizujesz przywoływany wiersz w tabeli nadrzędnej. Wartość domyślna to NO ACTION.

BRAK AKCJI

Database Engine zgłasza błąd, a akcja aktualizacji w wierszu w tabeli nadrzędnej jest cofana.

CASCADE

Odpowiednie wiersze są aktualizowane w tabeli odwołującej się po zaktualizowaniu tego wiersza w tabeli nadrzędnej.

USTAW NULL

Ustawia wszystkie wartości tworzące klucz obcy na NULL podczas aktualizowania odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, kolumny klucza obcego muszą mieć wartość null.

USTAW DOMYŚLNE

Wszystkie wartości tworzące klucz obcy są ustawione na wartości domyślne po zaktualizowaniu odpowiedniego wiersza w tabeli nadrzędnej. Aby to ograniczenie było wykonywane, wszystkie kolumny klucza obcego muszą mieć definicje domyślne. Jeśli kolumna jest dopuszczana do wartości null i nie ma jawnego zestawu wartości domyślnych, NULL staje się niejawną wartością domyślną kolumny.

Nie określaj CASCADE , czy tabela jest zawarta w publikacji scalanej, która używa rekordów logicznych. Aby uzyskać więcej informacji na temat rekordów logicznych, zobacz Grupowanie zmian w powiązanych wierszach z rekordami logicznymi.

ON UPDATE CASCADE, SET NULLlub SET DEFAULT nie można zdefiniować, jeśli INSTEAD OF wyzwalacz ON UPDATE już istnieje w tabeli, która jest zmieniana.

Na przykład w AdventureWorks2025 bazie danych ProductVendor tabela ma relację odwołania z tabelą Vendor . Klucz ProductVendor.VendorID obcy odwołuje się do klucza podstawowego Vendor.VendorID .

Jeśli wykonasz instrukcję UPDATE wiersza w tabeli Vendor i określisz akcję ON UPDATE CASCADE dla ProductVendor.VendorID, Database Engine sprawdza co najmniej jeden wiersz zależny w tabeli ProductVendor. Jeśli istnieje, wiersz zależny w ProductVendor tabeli zostanie zaktualizowany, a także wiersz, do którego Vendor odwołuje się tabela.

Z drugiej strony, jeśli określisz NO ACTION, Database Engine zgłasza błąd i cofa akcję aktualizacji w wierszu Vendor, gdy istnieje co najmniej jeden wiersz w tabeli ProductVendor odwołującej się do niego.

NIE DOTYCZY REPLIKACJI

Applies to: SQL Server 2008 (10.0.x) i nowsze wersje.

Jeśli określisz tę klauzulę dla ograniczenia, agenci replikacji nie wymuszają ograniczenia podczas wykonywania operacji zapisu. Tę klauzulę można określić dla FOREIGN KEY ograniczeń i CHECK ograniczeń.

CONNECTION

Określa parę tabel węzłów, z którymi może nawiązać połączenie danego ograniczenia krawędzi. ON DELETE określa, co się stanie z wierszami w tabeli krawędzi, gdy węzły, z którymi łączy się krawędź, zostaną usunięte.

DEFAULT

Określa wartość domyślną kolumny. Użyj DEFAULT definicji, aby podać wartości dla nowej kolumny w istniejących wierszach danych. Nie można dodawać DEFAULT definicji do kolumn, które mają typ danych sygnatury czasowej , IDENTITY właściwość, istniejącą DEFAULT definicję lub powiązaną wartość domyślną. Jeśli kolumna ma istniejącą wartość domyślną, przed dodaniem nowej wartości domyślnej należy usunąć wartość domyślną. Jeśli określisz wartość domyślną dla kolumny typu zdefiniowanego przez użytkownika, typ powinien obsługiwać niejawną konwersję z constant_expression do typu zdefiniowanego przez użytkownika. Aby zachować zgodność z wcześniejszymi wersjami SQL Server, można przypisać nazwę ograniczenia do DEFAULT.

Constant_expression

Wartość literału, funkcja systemowa NULLlub , która jest używana jako domyślna wartość kolumny. Jeśli używasz constant_expression w połączeniu z kolumną zdefiniowaną jako typ zdefiniowany przez użytkownika Microsoft .NET Framework, implementacja typu musi obsługiwać niejawną konwersję z constant_expression do typu zdefiniowanego przez użytkownika.

KOLUMNA FOR

Określa kolumnę skojarzona z definicją na poziomie DEFAULT tabeli.

Z WARTOŚCIAMI

  • Po dodaniu kolumny i DEFAULT ograniczenia, jeśli kolumna zezwala na wartości null, przy użyciu ustawia WITH VALUES wartość nowej kolumny dla istniejących wierszy na wartość podaną w DEFAULTconstant_expression.

  • Jeśli dodana kolumna nie zezwala na wartości null, wartość kolumny dla istniejących wierszy jest zawsze ustawiana na wartość podaną w wyrażeniuDEFAULT stałym.

W SQL Server 2012 i nowszych wersjach ta operacja może być operacją metadanych adding-not-null-columns-as-an-online-operation.

Jeśli używasz WITH VALUES polecenia , gdy powiązana kolumna nie jest również dodawana, nie ma żadnego efektu.

CHECK

Ograniczenie wymuszające integralność domeny przez ograniczenie możliwych wartości, które można wprowadzić w kolumnie lub kolumnach.

logical_expression

Wyrażenie logiczne używane w ograniczeniu CHECK , które zwraca TRUE wartość lub FALSE. logical_expression używane z CHECK ograniczeniami nie mogą odwoływać się do innej tabeli, ale mogą odwoływać się do innych kolumn w tej samej tabeli dla tego samego wiersza. Wyrażenie nie może odwoływać się do typu danych aliasu.

Remarks

Po dodaniu FOREIGN KEY lub CHECK ograniczeniu system sprawdza wszystkie istniejące dane pod kątem naruszeń ograniczeń, chyba że zostanie określona WITH NOCHECK opcja. Jeśli wystąpią jakiekolwiek naruszenia, ALTER TABLE kończy się niepowodzeniem i zwraca błąd. Po dodaniu nowego PRIMARY KEY lub UNIQUE ograniczenia do istniejącej kolumny dane w kolumnie lub kolumnach muszą być unikatowe. Jeśli zostaną znalezione zduplikowane wartości, ALTER TABLE nie powiedzie się. Opcja WITH NOCHECK nie ma żadnego wpływu podczas dodawania PRIMARY KEY lub UNIQUE ograniczeń.

Każde PRIMARY KEY ograniczenie i UNIQUE generuje indeks. UNIQUE Liczba indeksów i PRIMARY KEY ograniczeń nie może spowodować, że liczba indeksów w tabeli przekroczy 999 indeksów nieklastrowanych i 1 indeks klastrowany. Ograniczenia klucza obcego nie generują automatycznie indeksu. Jednak często używasz kolumn kluczy obcych w kryteriach sprzężenia w zapytaniach, pasując do kolumny lub kolumn w ograniczeniu klucza obcego jednej tabeli z kolumną klucza podstawowego lub unikatowego lub kolumnami w drugiej tabeli. Indeks w kolumnach klucza obcego umożliwia Database Engine szybkie znajdowanie powiązanych danych w tabeli kluczy obcych.

W SQL Server 2022 (16.x) i nowszych wersjach operacje z możliwością wznowienia obsługują dodawanie ograniczeń tabeli dla klucza podstawowego i unikatowych ograniczeń klucza. Aby uzyskać więcej informacji na temat włączania i używania operacji wznawianych ALTER TABLE ADD CONSTRAINT , zobacz Wznawianie ograniczeń tabeli.

Magazyn w Microsoft Fabric obsługuje ADD lub DROPPRIMARY KEY, UNIQUE i FOREIGN_KEY ograniczenia kolumn, ale tylko wtedy, gdy określisz opcję NOT ENFORCED. Magazyn w Microsoft Fabric blokuje wszystkie inne operacje ALTER TABLE.

Examples

Aby zapoznać się z przykładami, zobacz ALTER TABLE (Transact-SQL).