Udostępnij za pośrednictwem


Unikatowe ograniczenia i sprawdzanie ograniczeń

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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.

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