Freigeben über


ALTER TABLE column_constraint (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric Preview

Gibt die Eigenschaften einer PRIMARY KEY-, FOREIGN KEY-, UNIQUE- oder CHECK-Einschränkung an, die Teil einer neuen Spaltendefinition ist, die einer Tabelle mithilfe von ALTER TABLE hinzugefügt wird.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax für SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric Preview

[ 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 )  
}  

Syntax für Microsoft Fabric Warehouse

[ 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

Gibt den Beginn der Definition für eine PRIMARY KEY-, UNIQUE-, FOREIGN KEY- oder CHECK-Einschränkung an.

constraint_name
Der Name der Einschränkung. Einschränkungsnamen müssen den Regeln für Bezeichner entsprechen, wobei der Name nicht mit einem Nummernzeichen (#) beginnen darf. Wenn constraint_name nicht angegeben ist, vergibt das System einen Namen für die Einschränkung.

NULL | NICHT NULL

Gibt an, ob die Spalte Werte akzeptieren NULL kann. Spalten, die keine Werte zulassen NULL , können nur hinzugefügt werden, wenn sie einen Standardwert haben. Wenn die neue Spalte Werte zulässt NULL und kein Standardwert angegeben wird, enthält NULL die neue Spalte für jede Zeile in der Tabelle. Wenn die neue Spalte Werte zulässt NULL und eine Standarddefinition mit der neuen Spalte hinzugefügt wird, kann die OPTION WITH VALUES verwendet werden, um den Standardwert in der neuen Spalte für jede vorhandene Zeile in der Tabelle zu speichern.

Wenn die neue Spalte keine Werte zulässt NULL , muss eine DEFAULT-Definition mit der neuen Spalte hinzugefügt werden. Die neue Spalte wird automatisch mit dem Standardwert in den neuen Spalten in jeder vorhandenen Zeile geladen.

Wenn das Hinzufügen einer Spalte Änderungen an den Datenzeilen einer Tabelle erfordert, wie z. B. das Hinzufügen von DEFAULT-Werten zu jeder Zeile, werden Sperren für die Tabelle aufrechterhalten, während ALTER TABLE ausgeführt wird. Dies beeinflusst die Möglichkeit, den Inhalt der Tabelle zu ändern, während die Sperre aktiviert ist. Im Gegensatz dazu ist das Hinzufügen einer Spalte, die Werte zulässt NULL und keinen Standardwert angibt, nur ein Metadatenvorgang und umfasst keine Sperren.

Wenn Sie Datenbank- und Sitzungseinstellungen verwenden CREATE TABLE oder verwenden oder ALTER TABLE, beeinflussen und überschreiben Sie möglicherweise die Nullierbarkeit des Datentyps, der in einer Spaltendefinition verwendet wird. Es wird empfohlen, immer explizit nicht komputierte Spalten als NULL oder NOT NULL , wenn Sie einen benutzerdefinierten Datentyp verwenden, explizit zu definieren, dass die Spalte die Standardmäßige Nullierbarkeit des Datentyps verwenden kann. Weitere Informationen finden Sie unter CREATE TABLE.

PRIMARY KEY

Eine Einschränkung, die Entitätsintegrität für eine angegebene Spalte (oder Spalten) mithilfe eines eindeutigen Index erzwingt. Es kann nur eine PRIMARY KEY-Einschränkung für jede Tabelle erstellt werden.

UNIQUE

Eine Einschränkung, die Entitätsintegrität für eine angegebene Spalte (oder Spalten) mit einem eindeutigen Index bietet.

GRUPPIERT | NICHT GRUPPIERT

Gibt an, dass ein gruppierter oder nicht gruppierter Index für die PRIMARY KEY- oder UNIQUE-Einschränkung erstellt wird. Für PRIMARY KEY-Einschränkungen wird standardmäßig CLUSTERED verwendet. Für UNIQUE-Einschränkungen wird standardmäßig NONCLUSTERED verwendet.

Wenn bereits eine gruppierte Einschränkung oder ein gruppierter Index für eine Tabelle vorhanden ist, kann CLUSTERED nicht angegeben werden. Wenn bereits eine gruppierte Einschränkung oder ein gruppierter Index für eine Tabelle vorhanden ist, wird für PRIMARY KEY-Einschränkungen standardmäßig NONCLUSTERED verwendet.

Die Datentypen ntext, text, varchar(max) , nvarchar(max) , varbinary(max) , xml und image können nicht als Spalten für einen Index angegeben werden.

In Microsoft Fabric Warehouse hat NONCLUSTERED keine Auswirkung.

WITH FILLFACTOR = fillfactor

Gibt an, wie weit Datenbank-Engine die einzelnen Indexseiten füllen soll, die zum Speichern der Indexdaten verwendet werden. Vom Benutzer angegebene Füllfaktorwerte können Zahlen von 1 bis 100 sein. Wenn kein Wert angegeben ist, lautet der Standardwert 0.

Important

Die WITH FILLFACTOR Dokumentation als einzige Indexoption, die für PRIMARY KEY- oder UNIQUE-Einschränkungen gilt, wird aus Gründen der Abwärtskompatibilität beibehalten, wird jedoch in zukünftigen Versionen nicht auf diese Weise dokumentiert. Andere Indexoptionen können in der index_option-Klausel der ALTER TABLE-Anweisung angegeben werden.

ON { partition_scheme_name(partition_column_name | default }

Gilt für: SQL Server 2008 (10.0.x) und höher.

Gibt den Speicherort des Indexes an, der für die Einschränkung erstellt wurde. Wenn partition_scheme_name angegeben wird, wird der Index partitioniert, und die Partitionen werden den Dateigruppen zugeordnet, die durch partition_scheme_name angegeben sind. Wenn filegroup angegeben ist, wird der Index in der genannten Dateigruppe erstellt. Wenn "default" angegeben ist, oder wenn ON nicht für alle festgelegt ist, wird der Index in derselben Dateigruppe erstellt wie die Tabelle. Wenn ON beim Hinzufügen eines gruppierten Index für eine PRIMARY KEY- oder UNIQUE-Einschränkung angegeben ist, wird die gesamte Tabelle beim Erstellen des gruppierten Index in die angegebene Dateigruppe verschoben.

In diesem Zusammenhang ist default kein Schlüsselwort. Dabei handelt es sich um einen Bezeichner für die Standarddateigruppe, der wie in ON default oder ON [default] abgegrenzt sein muss. Wenn der Standardwert angegeben ist, muss die QUOTED_IDENTIFIER Option für die aktuelle Sitzung aktiviert sein. Dies ist die Standardeinstellung. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).

NOT ENFORCED

In Microsoft Fabric Warehouse erfordern Primärschlüssel, eindeutigen Schlüssel und Fremdschlüsseleinschränkungen NICHT ERZWUNGEN. Die Integrität der Einschränkungen muss von der Anwendung aufrechterhalten werden.

FREMDSCHLÜSSELVERWEISE

Eine Einschränkung, die referenzielle Integrität für die Daten in der Spalte bereitstellt. FREMDSCHLÜSSELeinschränkungen erfordern, dass jeder Wert in der Spalte in der angegebenen Spalte in der referenzierten Tabelle vorhanden ist.

schema_name
Der Name des Schemas, zu dem die Tabelle gehört, auf die mit der FOREIGN KEY-Einschränkung verwiesen wird.

referenced_table_name
Die Tabelle, auf die die FOREIGN KEY-Einschränkung verweist.

ref_column
Eine Spalte in Klammern, auf die die neue FOREIGN KEY-Einschränkung verweist.

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

Gibt an, welche Aktion für eine Zeile der geänderten Tabelle ausgeführt werden soll, wenn diese Zeile eine referenzielle Beziehung hat, und die Zeile, auf die verwiesen wird, aus der übergeordneten Tabelle gelöscht wird. Der Standardwert ist NO ACTION.

NO ACTION
SQL Server-Datenbank-Engine löst einen Fehler aus, und für die Aktion zum Löschen der Zeile in der übergeordneten Tabelle wird ein Rollback ausgeführt.

CASCADE
Wenn diese Zeile aus der übergeordneten Tabelle gelöscht wird, werden die entsprechenden Zeilen aus der verweisenden Tabelle gelöscht.

SET NULL
Alle Werte, aus denen der Fremdschlüssel besteht, werden festgelegt NULL , wenn die entsprechende Zeile in der übergeordneten Tabelle gelöscht wird. Die Fremdschlüsselspalten müssen NULL-Werte zulassen, um diese Einschränkung auszuführen.

SET DEFAULT
Alle Werte, aus denen sich der Fremdschlüssel zusammensetzt, werden auf die Standardwerte festgelegt, wenn die entsprechende Zeile in der übergeordneten Tabelle gelöscht wird. Alle Fremdschlüsselspalten müssen Standarddefinitionen aufweisen, damit diese Einschränkung ausgeführt wird. Wenn eine Spalte nullfähig ist und kein expliziter Standardwert festgelegt ist, NULL wird der implizite Standardwert der Spalte.

Geben Sie CASCADE nicht an, wenn die Tabelle in eine Mergeveröffentlichung einbezogen werden soll, bei der logische Datensätze verwendet werden. Weitere Informationen zu logischen Datensätzen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

ON DELETE CASCADE kann nicht definiert werden, wenn bereits ein INSTEAD OF Trigger ON DELETE in der Tabelle vorhanden ist, die geändert wird.

In der AdventureWorks2022-Datenbank verfügt die ProductVendor-Tabelle z. B. über eine referenzielle Beziehung zur Vendor-Tabelle. Die ProductVendor. VendorID Fremdschlüssel verweist auf die Vendor. VendorID Primärschlüssel.

Wenn eine DELETE-Anweisung in einer Zeile in der Vendor Tabelle ausgeführt wird und eine ON DELETE CASCADE-Aktion für ProductVendor.VendorID, wird die Datenbank-Engine auf eine oder mehrere abhängige Zeilen in der ProductVendor Tabelle überprüft. Wenn vorhanden, werden die abhängigen Zeilen in der ProductVendor Tabelle zusätzlich zu der Zeile gelöscht, auf die in der Vendor Tabelle verwiesen wird.

Wenn keine AKTION angegeben wird, löst die Datenbank-Engine einen Fehler aus und setzt die Löschaktion in der Vendor Zeile zurück, wenn mindestens eine Zeile in der Tabelle vorhanden ist, die ProductVendor darauf verweist.

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

Gibt an, welche Aktion für eine Zeile der geänderten Tabelle ausgeführt werden soll, wenn diese Zeile eine referenzielle Beziehung hat und die Zeile, auf die verwiesen wird, in der übergeordneten Tabelle aktualisiert wird. Der Standardwert ist NO ACTION.

NO ACTION
Datenbank-Engine löst einen Fehler aus, und für die Updateaktion der Zeile in der übergeordneten Tabelle wird ein Rollback ausgeführt.

CASCADE
Wenn diese Zeile in der übergeordneten Tabelle aktualisiert wird, werden die entsprechenden Zeilen in der verweisenden Tabelle aktualisiert.

SET NULL
Alle Werte, aus denen der Fremdschlüssel besteht, werden festgelegt NULL , wenn die entsprechende Zeile in der übergeordneten Tabelle aktualisiert wird. Die Fremdschlüsselspalten müssen NULL-Werte zulassen, um diese Einschränkung auszuführen.

SET DEFAULT
Alle Werte, aus denen sich der Fremdschlüssel zusammensetzt, werden auf die Standardwerte festgelegt, wenn die entsprechende Zeile in der übergeordneten Tabelle aktualisiert wird. Alle Fremdschlüsselspalten müssen Standarddefinitionen aufweisen, damit diese Einschränkung ausgeführt wird. Wenn eine Spalte nullfähig ist und kein expliziter Standardwert festgelegt ist, NULL wird der implizite Standardwert der Spalte.

Geben Sie CASCADE nicht an, wenn die Tabelle in eine Mergeveröffentlichung einbezogen werden soll, bei der logische Datensätze verwendet werden. Weitere Informationen zu logischen Datensätzen finden Sie unter Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen Datensätzen.

ON UPDATE CASCADE, SET NULL oder SET DEFAULT können nicht definiert werden, wenn für ON UPDATE schon ein INSTEAD OF-Trigger für die Tabelle vorhanden ist, die geändert wird.

In der AdventureWorks2022-Datenbank verfügt die ProductVendor-Tabelle z. B. über eine referenzielle Beziehung zur Vendor-Tabelle. Die ProductVendor. VendorID Fremdschlüssel verweist auf die Vendor. VendorID Primärschlüssel.

Wenn eine UPDATE-Anweisung in einer Zeile in der Vendor Tabelle ausgeführt wird und eine ON UPDATE CASCADE Aktion für ProductVendor.VendorID, die Datenbank-Engine überprüft, ob eine oder mehrere abhängige Zeilen in der ProductVendor Tabelle vorhanden sind. Wenn vorhanden, wird die abhängige Zeile in der ProductVendor Tabelle zusätzlich zu der Zeile aktualisiert, auf die in der Vendor Tabelle verwiesen wird.

Wenn keine AKTION angegeben wird, löst die Datenbank-Engine einen Fehler aus und setzt die Aktualisierungsaktion in der Vendor Zeile zurück, wenn mindestens eine Zeile in der Tabelle vorhanden ist, die ProductVendor darauf verweist.

NICHT FÜR REPLIKATION
Gilt für: SQL Server 2008 (10.0.x) und höher.

Kann für FOREIGN KEY- und CHECK-Einschränkungen festgelegt werden. Wenn diese Klausel für eine Einschränkung angegeben wird, wird die Einschränkung nicht erzwungen, wenn Replikations-Agents Einfüge-, Update- oder Löschvorgänge ausführen.

CHECK

Eine Einschränkung, die Domänenintegrität erzwingt, indem die möglichen Eingabewerte für eine oder mehrere Spalten beschränkt wird.

logical_expression
Ein logischer Ausdruck, der in einer CHECK-Einschränkung verwendet wird und TRUE oder FALSE zurückgibt. Werden die CHECK-Einschränkungen zusammen mit logical_expression verwendet, kann nicht auf eine andere Tabelle, jedoch auf andere Spalten in derselben Tabelle für dieselbe Zeile verwiesen werden. Der Ausdruck kann keinen Verweis auf einen Aliasdatentyp enthalten.

Remarks

Wenn FREMDSCHLÜSSEL- oder CHECK-Einschränkungen hinzugefügt werden, werden alle vorhandenen Daten auf Einschränkungsverletzungen überprüft, es sei denn, die WITH NOCHECK Option ist angegeben. Bei Verletzungen schlägt die ALTER TABLE-Anweisung fehl, und ein Fehler wird zurückgegeben. Wenn eine neue PRIMARY KEY- oder UNIQUE-Einschränkung zu einer vorhandenen Spalte hinzugefügt wird, müssen die Daten in der/den Spalte(n) eindeutig sein. Wenn doppelte Werte gefunden werden, schlägt die ALTER TABLE-Anweisung fehl. Die WITH NOCHECK Option hat keine Auswirkung, wenn PRIMARY KEY- oder UNIQUE-Einschränkungen hinzugefügt werden.

Jede PRIMARY KEY- und UNIQUE-Einschränkung generiert einen Index. Die Anzahl der UNIQUE- und PRIMARY KEY-Einschränkungen darf nicht dazu führen, dass die Anzahl der Indizes der Tabelle 999 nicht gruppierte Indizes und 1 gruppierten Index übersteigt. FOREIGN KEY-Einschränkungen generieren nicht automatisch einen Index. Fremdschlüsselspalten werden jedoch häufig in Abfragebeitrittskriterien verwendet, indem sie die Fremdschlüsseleinschränkung einer Tabelle mit der Primärschlüsselspalte oder -spalten in der anderen Tabelle abgleichen. Ein Index für die Fremdschlüsselspalte ermöglicht Datenbank-Engine, die verbundenen Daten in der Fremdschlüsseltabelle schnell zu finden.

Examples

Beispiele finden Sie unter ALTER TABLE (Transact-SQL).