Unikatowe ograniczenia i sprawdzanie ograniczeń
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Database w usłudze Microsoft Fabric
Ograniczenia UNIQUE
i ograniczenia CHECK
to dwa typy ograniczeń, które można zastosować do wymuszania integralności danych w tabelach SQL Server. Są to ważne obiekty bazy danych.
Ten artykuł zawiera następujące sekcje.
Ograniczenia UNIQUE
Ograniczenia to reguły wymuszane przez aparat bazy danych programu SQL Server. Na przykład można użyć ograniczeń UNIQUE
, aby zapewnić, żeby żadne zduplikowane wartości nie były wprowadzane w określonych kolumnach, które nie są częścią klucza podstawowego. Mimo że zarówno ograniczenie UNIQUE
, jak i ograniczenie PRIMARY KEY
wymuszają unikatowość, należy użyć ograniczenia UNIQUE
zamiast ograniczenia PRIMARY KEY
, gdy chcesz wymusić unikatowość kolumny (lub kombinacji kolumn), która nie jest kluczem podstawowym.
W przeciwieństwie do ograniczeń PRIMARY KEY
ograniczenia UNIQUE
zezwalają na wartość NULL
. Jednak podobnie jak w przypadku każdej wartości biorącej udział w ograniczeniu UNIQUE
, dozwolona jest tylko jedna wartość null dla kolumny. Ograniczenie UNIQUE
może być przywoływane przez ograniczenie FOREIGN KEY
.
Po dodaniu ograniczenia UNIQUE
do istniejącej kolumny lub kolumn w tabeli domyślnie aparat bazy danych sprawdza istniejące dane w kolumnach, aby upewnić się, że wszystkie wartości są unikatowe. Jeśli ograniczenie UNIQUE
zostanie dodane do kolumny zawierającej zduplikowane wartości, aparat bazy danych zwraca błąd i nie dodaje ograniczenia.
Aparat bazy danych automatycznie tworzy indeks UNIQUE
, aby wymusić wymaganie unikatowości ograniczenia UNIQUE
. W związku z tym, jeśli zostanie podjęta próba wstawienia zduplikowanego wiersza, aparat bazy danych zwróci komunikat o błędzie informujący, że ograniczenie UNIQUE
zostało naruszone i nie dodaje wiersza do tabeli. Jeśli indeks klastrowany nie zostanie jawnie określony, domyślnie tworzony jest unikatowy indeks nieklastrowany, aby wymusić ograniczenie UNIQUE
.
SPRAWDZANIE ograniczeń
Ograniczenia CHECK
zapewniają integralność dziedziny, ograniczając wartości przyjmowane przez jedną lub więcej kolumn. Można utworzyć ograniczenie CHECK
z dowolnym wyrażeniem logicznym, które zwraca TRUE
lub FALSE
w oparciu o operatory logiczne. Na przykład zakres wartości dla kolumny salary
może być ograniczony przez utworzenie ograniczenia CHECK
, które zezwala tylko na dane z zakresu od 15 000 USD do 100 000 USD. Zapobiega to wprowadzaniu wynagrodzeń poza zwykły zakres. Wyrażenie logiczne będzie następujące: salary >= 15000 AND salary <= 100000
.
Do jednej kolumny można zastosować wiele ograniczeń CHECK
. Można również zastosować jedno ograniczenie CHECK
do wielu kolumn, tworząc je na poziomie tabeli. Na przykład ograniczenie wielokolumnowe CHECK
może służyć do potwierdzenia, że dowolny wiersz z wartością kolumny country_region
równą USA
również ma dwuznakową wartość w kolumnie state
. Dzięki temu można zaewidencjonować wiele warunków w jednej lokalizacji.
CHECK
ograniczenia są podobne do ograniczeń FOREIGN KEY
, które kontrolują wartości umieszczone w kolumnie. Różnica polega na tym, jak określają, które wartości są prawidłowe: FOREIGN KEY
ograniczenia uzyskują listę prawidłowych wartości z innej tabeli, podczas gdy CHECK
ograniczenia określają prawidłowe wartości z wyrażenia logicznego.
Ostrożność
Ograniczenia obejmujące niejawną lub jawną konwersję typu danych mogą spowodować niepowodzenie niektórych operacji. Na przykład takie ograniczenia zdefiniowane w tabelach, które są źródłami przełączania partycji, mogą spowodować niepowodzenie operacji ALTER TABLE...SWITCH
. Unikaj konwersji typów danych w definicjach ograniczeń.
Ograniczenia funkcji CHECK
CHECK
ograniczenia odrzucają wartości, które rozwiązują się na FALSE
. Ponieważ wartości null są oceniane jako UNKNOWN, ich obecność w wyrażeniach może unieważnić ograniczenie. Załóżmy na przykład, że w kolumnie MyColumn
umieszczasz ograniczenie, określając, że MyColumn
może zawierać tylko wartość 10 (MyColumn=10
). Jeśli wstawisz wartość NULL
do MyColumn
, silnik bazy danych wstawia NULL
i nie zwraca błędu.
Ograniczenie CHECK
zwraca TRUE
, gdy sprawdzany warunek nie jest FALSE
dla żadnego wiersza w tabeli. Ograniczenie CHECK
działa na poziomie wiersza. Jeśli utworzona tabela nie zawiera żadnych wierszy, każde ograniczenie CHECK
w tej tabeli jest uznawane za prawidłowe. Taka sytuacja może spowodować nieoczekiwane wyniki, jak w poniższym przykładzie.
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
Dodawane ograniczenie CHECK
określa, że musi istnieć co najmniej jeden wiersz w tabeli CheckTbl
. Jednak ze względu na to, że w tabeli nie ma wierszy, względem których można sprawdzić warunek tego ograniczenia, instrukcja ALTER TABLE
zakończy się pomyślnie.
CHECK
ograniczenia nie są weryfikowane podczas deklaracji DELETE
. W związku z tym wykonywanie instrukcji DELETE
w tabelach z pewnymi typami ograniczeń sprawdzania może spowodować nieoczekiwane wyniki. Rozważmy na przykład następujące instrukcje wykonywane w tabeli CheckTbl
.
INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;
Instrukcja DELETE
zakończy się powodzeniem, mimo że ograniczenie CHECK
określa, że tabela CheckTbl
musi mieć co najmniej 1
wierszy.
Notatka
Jeśli tabela jest opublikowana na potrzeby replikacji, należy wprowadzić zmiany schematu przy użyciu instrukcji Transact-SQL ALTER TABLE lub obiektów zarządzania programu SQL Server (SMO). Gdy zmiany schematu są wprowadzane przy użyciu Projektanta tabel lub Projektanta diagramu bazy danych, próbuje usunąć i ponownie utworzyć tabelę. Nie można usunąć opublikowanych obiektów, dlatego zmiana schematu zakończy się niepowodzeniem.
Powiązane zadania
Zadanie | Artykuł |
---|---|
Opisuje sposób tworzenia unikatowego ograniczenia. | Tworzenie unikalnych ograniczeń |
Opisuje sposób modyfikowania unikatowego ograniczenia. | Modyfikowanie Unikatowych Ograniczeń |
Opisuje sposób usuwania unikatowego ograniczenia. | Usuń Unikatowe Ograniczenia |
Opisuje sposób tworzenia ograniczenia CHECK. | Tworzenie ograniczeń sprawdzania |
Opisuje sposób wyłączania ograniczenia sprawdzania, gdy agent replikacji wstawia lub aktualizuje dane w tabeli. | Wyłącz sprawdzanie ograniczeń dla replikacji |
Opisuje sposób wyłączania ograniczenia sprawdzania po dodaniu, zaktualizowaniu lub usunięciu danych z tabeli. | Wyłącz ograniczenia CHECK za pomocą instrukcji INSERT i UPDATE |
Opisuje sposób zmiany wyrażenia ograniczenia lub opcji, które włączają lub wyłączają ograniczenie dla określonych warunków. | Modyfikacja ograniczeń kontrolnych |
Opisuje, jak usunąć ograniczenie CHECK. | Usuń ograniczenia sprawdzania |
Opisuje sposób wyświetlania właściwości ograniczenia sprawdzania. | Unikalne ograniczenia i ograniczenia kontrolne |