UNIQUE- und CHECK-EinschränkungenUnique Constraints and Check Constraints

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

UNIQUE-Einschränkungen und CHECK-Einschränkungen sind zwei Typen von Einschränkungen, mit denen die Datenintegrität in SQL ServerSQL Server -Tabellen erzwungen werden kann.UNIQUE constraints and CHECK constraints are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. Diese sind wichtige Datenbankobjekte.These are important database objects.

Dieses Thema enthält folgende Abschnitte:This topic contains the following sections.

UNIQUE-EinschränkungenUNIQUE Constraints

CHECK-EinschränkungenCHECK Constraints

Verwandte AufgabenRelated Tasks

UNIQUE-EinschränkungenUNIQUE Constraints

Einschränkungen sind Regeln, die von SQL Server-Datenbank-EngineSQL Server Database Engine für Sie erzwungen werden.Constraints are rules that the SQL Server-Datenbank-EngineSQL Server Database Engine enforces for you. Mithilfe von UNIQUE-Einschränkungen können Sie z. B. sicherstellen, dass keine doppelten Werte in bestimmte Spalten eingegeben werden können, die nicht Teil eines Primärschlüssels sind.For example, you can use UNIQUE constraints to make sure that no duplicate values are entered in specific columns that do not participate in a primary key. Obwohl sowohl eine UNIQUE-Einschränkung als auch eine PRIMARY KEY-Einschränkung Eindeutigkeit erzwingt, sollte eine UNIQUE-Einschränkung anstelle einer PRIMARY KEY-Einschränkung verwendet werden, wenn Sie die Eindeutigkeit einer Spalte bzw. einer Kombination von Spalten erzwingen möchten, die nicht den Primärschlüssel darstellt.Although both a UNIQUE constraint and a PRIMARY KEY constraint enforce uniqueness, use a UNIQUE constraint instead of a PRIMARY KEY constraint when you want to enforce the uniqueness of a column, or combination of columns, that is not the primary key.

Im Gegensatz zu PRIMARY KEY-Einschränkungen lassen UNIQUE-Einschränkungen den Wert NULL zu.Unlike PRIMARY KEY constraints, UNIQUE constraints allow for the value NULL. Wie bei jedem Wert, der in einer UNIQUE-Einschränkung enthalten ist, ist jedoch nur ein NULL-Wert pro Spalte zulässig.However, as with any value participating in a UNIQUE constraint, only one null value is allowed per column. Auf eine UNIQUE-Einschränkung kann durch eine FOREIGN KEY-Einschränkung verwiesen werden.A UNIQUE constraint can be referenced by a FOREIGN KEY constraint.

Wenn eine UNIQUE-Einschränkung einer vorhandenen Spalte bzw. vorhandenen Spalten in der Tabelle hinzugefügt wird, überprüft Datenbank-EngineDatabase Engine die vorhandenen Daten in den Spalten, um sicherzustellen, dass alle Werte eindeutig sind.When a UNIQUE constraint is added to an existing column or columns in the table, by default, the Datenbank-EngineDatabase Engine examines the existing data in the columns to make sure all values are unique. Wenn eine UNIQUE-Einschränkung zu einer Spalte hinzugefügt wird, die doppelte Werte enthält, gibt Datenbank-EngineDatabase Engine einen Fehler zurück und fügt die Einschränkung nicht hinzu.If a UNIQUE constraint is added to a column that has duplicated values, the Datenbank-EngineDatabase Engine returns an error and does not add the constraint.

Datenbank-EngineDatabase Engine erstellt automatisch einen UNIQUE-Index, um die Anforderung an die Eindeutigkeit für die UNIQUE-Einschränkung zu erzwingen.The Datenbank-EngineDatabase Engine automatically creates a UNIQUE index to enforce the uniqueness requirement of the UNIQUE constraint. Wenn ein Versuch unternommen wird, eine doppelte Zeile einzufügen, gibt Datenbank-EngineDatabase Engine eine Fehlermeldung zurück, die darauf hinweist, dass die UNIQUE-Einschränkung verletzt wurde, und fügt die Zeile der Tabelle nicht hinzu.Therefore, if an attempt to insert a duplicate row is made, the Datenbank-EngineDatabase Engine returns an error message that states the UNIQUE constraint has been violated and does not add the row to the table. Standardmäßig wird ein eindeutiger nicht gruppierter Index erstellt, um die UNIQUE-Einschränkung zu erzwingen, es sei denn, ein gruppierter Index wird explizit angegeben.Unless a clustered index is explicitly specified, a unique, nonclustered index is created by default to enforce the UNIQUE constraint.

CHECK-EinschränkungenCHECK Constraints

CHECK-Einschränkungen erzwingen die Domänenintegrität, indem sie die Werte begrenzen, die in einer oder mehreren Spalten zulässig sind.CHECK constraints enforce domain integrity by limiting the values that are accepted by one or more columns. Sie können eine CHECK-Einschränkung mit jedem logischen (booleschen) Ausdruck erstellen, der basierend auf den logischen Operatoren TRUE oder FALSE zurückgibt.You can create a CHECK constraint with any logical (Boolean) expression that returns TRUE or FALSE based on the logical operators. Es ist z. B. möglich, den Bereich der Werte für eine Gehalts -Spalte zu begrenzen, indem eine CHECK-Einschränkung erstellt wird, die nur Daten zwischen 15.000 $ und 100.000 $ zulässt.For example, the range of values for a salary column can be limited by creating a CHECK constraint that allows for only data that ranges from $15,000 through $100,000. Auf diese Weise wird verhindert, dass Daten eingegeben werden können, die außerhalb des normalen Einkommensbereichs liegen.This prevents salaries from being entered beyond the regular salary range. Der logische Ausdruck würde wie folgt aussehen: salary >= 15000 AND salary <= 100000.The logical expression would be the following: salary >= 15000 AND salary <= 100000.

Sie können mehrere CHECK-Einschränkungen auf eine einzelne Spalte anwenden.You can apply multiple CHECK constraints to a single column. Es ist auch möglich, eine einzelne CHECK-Einschränkung auf mehrere Spalten anzuwenden, indem die Einschränkung auf Tabellenebene erstellt wird.You can also apply a single CHECK constraint to multiple columns by creating it at the table level. So könnte z. B. eine CHECK-Einschränkung für mehrere Spalten verwendet werden, um sicherzustellen, dass jede Zeile mit dem Wert USA in der country_region -Spalte auch einen aus zwei Zeichen bestehenden Wert in der state -Spalte aufweist.For example, a multiple-column CHECK constraint could be used to confirm that any row with a country_region column value of USA also has a two-character value in the state column. Auf diese Weise können mehrere Bedingungen an einer Stelle überprüft werden.This allows for multiple conditions to be checked in one location.

CHECK-Einschränkungen sind insofern FOREIGN KEY-Einschränkungen ähnlich, als sie die Werte kontrollieren, die in eine Spalte geschrieben werden.CHECK constraints are similar to FOREIGN KEY constraints in that they control the values that are put in a column. Der Unterschied besteht darin, wie sie bestimmen, welche Werte gültig sind: FOREIGN KEY-Einschränkungen rufen die Liste der gültigen Werte von einer anderen Tabelle ab, und CHECK-Einschränkungen ermitteln die gültigen Werte anhand eines logischen Ausdrucks.The difference is in how they determine which values are valid: FOREIGN KEY constraints obtain the list of valid values from another table, while CHECK constraints determine the valid values from a logical expression.

Achtung

Einschränkungen, die implizite oder explizite Datentypkonvertierungen einschließen, können bei bestimmten Vorgängen einen Fehler erzeugen.Constraints that include implicit or explicit data type conversion may cause certain operations to fail. So können z. B. Einschränkungen, die für Tabellen definiert werden, die ihrerseits die Quellen von Partitionswechseln sind, bei einer ALTER TABLE...SWITCH-Operation zu einem Fehler führen.For example, such constraints defined on tables that are sources of partition switching may cause an ALTER TABLE...SWITCH operation to fail. Vermeiden Sie deshalb die Datentypkonvertierung in Einschränkungsdefinitionen.Avoid data type conversion in constraint definitions.

Beschränkungen bei CHECK-EinschränkungenLimitations of CHECK Constraints

CHECK-Einschränkungen weisen Werte zurück, die als FALSE ausgewertet werden.CHECK constraints reject values that evaluate to FALSE. Da NULL-Werte als UNKNOWN ausgewertet werden, kann deren Vorhandensein in Ausdrücken zum Überschreiben einer Einschränkung führen.Because null values evaluate to UNKNOWN, their presence in expressions may override a constraint. Angenommen, Sie platzieren z. B. eine Einschränkung für eine int -Spalte MyColumn und geben darin an, dass MyColumn ausschließliche den Wert 10 enthalten darf (MyColumn=10).For example, suppose you place a constraint on an int column MyColumn specifying that MyColumn can contain only the value 10 (MyColumn=10). Wenn Sie dann den Wert NULL in MyColumneinfügen, wird von Datenbank-EngineDatabase Engine der Wert NULL eingefügt, und es wird kein Fehler zurückgegeben.If you insert the value NULL into MyColumn, the Datenbank-EngineDatabase Engine inserts NULL and does not return an error.

Eine CHECK-Einschränkung gibt TRUE zurück, wenn die von ihr überprüfte Bedingung für alle Zeilen in der Tabelle nicht FALSE ist.A CHECK constraint returns TRUE when the condition it is checking is not FALSE for any row in the table. CHECK-Einschränkungen werden auf Zeilenebene verwendet.A CHECK constraint works at the row level. Wenn eine gerade erstellte Tabelle über keinerlei Zeilen verfügt, wird jede CHECK-Einschränkung für diese Tabelle als gültig betrachtet.If a table that has just been created does not have any rows, any CHECK constraint on this table is considered valid. Dieser Umstand kann zu unerwarteten Ergebnissen führen, wie das im folgenden Beispiel gezeigt wird.This situation can produce unexpected results, as in the following example.

CREATE TABLE CheckTbl (col1 int, col2 int);  
GO  
CREATE FUNCTION CheckFnctn()  
RETURNS int  
AS   
BEGIN  
   DECLARE @retval int  
   SELECT @retval = COUNT(*) FROM CheckTbl  
   RETURN @retval  
END;  
GO  
ALTER TABLE CheckTbl  
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );  
GO  

Die hinzugefügte CHECK -Einschränkung gibt an, dass es mindestens eine Zeile in der CheckTbl-Tabelle geben muss.The CHECK constraint being added specifies that there must be at least one row in table CheckTbl. Da es aber in der Tabelle keine Zeilen gibt, für die die Bedingung dieser Einschränkung überprüft werden kann, wird die ALTER TABLE-Anweisung erfolgreich ausgeführt.However, because there are no rows in the table against which to check the condition of this constraint, the ALTER TABLE statement succeeds.

CHECK-Einschränkungen werden beim Ausführen von DELETE-Anweisungen nicht überprüft.CHECK constraints are not validated during DELETE statements. Deshalb kann das Ausführen von DELETE-Anweisungen für Tabellen mit bestimmten Typen von CHECK-Einschränkungen zu unerwarteten Ergebnissen führen.Therefore, executing DELETE statements on tables with certain types of check constraints may produce unexpected results. Betrachten Sie beispielsweise das Ausführen der folgenden Anweisungen für die CheckTbl-Tabelle.For example, consider the following statements executed on table CheckTbl.

INSERT INTO CheckTbl VALUES (10, 10);  
GO  
DELETE CheckTbl WHERE col1 = 10;  

Die DELETE -Anweisung wird erfolgreich ausgeführt, obwohl die CHECK -Einschränkung angibt, dass die CheckTbl -Tabelle über mindestens 1 Zeile verfügen muss.The DELETE statement succeeds, even though the CHECK constraint specifies that table CheckTbl must have at least 1 row.

Verwandte AufgabenRelated Tasks

Hinweis

Wenn die Tabelle zur Replikation veröffentlicht ist, müssen Sie mit der Transact-SQL-Anweisung ALTER TABLE oder mit SMO (SQL Server Management Objects) Schemaänderungen ausführen.If the table is published for replication, you must make schema changes using the Transact-SQL statement ALTER TABLE or SQL Server Management Objects (SMO). Wenn die Schemaänderungen mit dem Tabellen-Designer oder dem Datenbankdiagramm-Designer ausgeführt werden, wird versucht, die Tabelle zu entfernen und erneut zu erstellen.When schema changes are made using the Table Designer or the Database Diagram Designer, it attempts to drop and recreate the table. Da veröffentlichte Objekte nicht gelöscht werden können, schlägt die Schemaänderung fehl.You cannot drop published objects, therefore the schema change will fail.

TaskTask ThemaTopic
Beschreibt, wie eine eindeutige Einschränkung erstellt wird.Describes how to create a unique constraint. Erstellen von Unique-EinschränkungenCreate Unique Constraints
Beschreibt, wie eine eindeutige Einschränkung geändert wird.Describes how to modify a unique constraint. Ändern von UNIQUE-EinschränkungenModify Unique Constraints
Beschreibt, wie eine eindeutige Einschränkung gelöscht wird.Describes how to delete a unique constraint. Löschen von Unique-EinschränkungenDelete Unique Constraints
Beschreibt, wie eine CHECK-Einschränkung deaktiviert wird, wenn ein Replikations-Agent Daten in die Tabelle einfügt oder darin aktualisiert.Describes how to disable a check constraint when a replication agent inserts or updates data in your table. Deaktivieren von CHECK-Einschränkungen für die ReplikationDisable Check Constraints for Replication
Beschreibt, wie eine CHECK-Einschränkung deaktiviert wird, wenn Sie Daten in einer Tabelle hinzufügen, aktualisieren oder löschen möchten.Describes how to disable a check constraint when data is added to, updated in, or deleted from a table. Deaktivieren von CHECK-Einschränkungen mit den Anweisungen INSERT und UPDATEDisable Check Constraints with INSERT and UPDATE Statements
Beschreibt, wie der Einschränkungsausdruck oder die Optionen geändert werden, die die Einschränkung unter bestimmten Bedingungen aktivieren und deaktivieren.Describes how to change the constraint expression or the options that enable or disable the constraint for specific conditions. Ändern von CHECK-EinschränkungenModify Check Constraints
Beschreibt, wie eine CHECK-Einschränkung gelöscht wird.Describes how to delete a check constraint. Löschen von CHECK-EinschränkungenDelete Check Constraints
Beschreibt, wie die Eigenschaften einer CHECK-Einschränkung angezeigt werden.Describes how to view the properties of a check constraint. UNIQUE- und CHECK-EinschränkungenUnique Constraints and Check Constraints