SQL Server UNIQUE Constraint (Polski)

Podsumowanie: W tym poradniku dowiesz się jak używać SQL Server UNIQUE constraint do zapewnienia unikalności danych zawartych w kolumnie lub grupie kolumn.

Wprowadzenie do SQL Servera Ograniczenie UNIQUE

Serwer SQL UNIQUE Ograniczenia pozwalają zapewnić, że dane przechowywane w kolumnie lub grupie kolumn są unikalne wśród wierszy w tabeli.

Poniższe wyrażenie tworzy tabelę, której dane w kolumnie email są unikalne wśród wierszy w tabeli hr.persons:

CREATE SCHEMA hr;GOCREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);
Code language: SQL (Structured Query Language) (sql)

W tej składni definiujemy ograniczenie UNIQUE jako ograniczenie kolumny. Można również zdefiniować ograniczenie UNIQUE jako ograniczenie tabeli, w ten sposób:

CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email));
Code language: SQL (Structured Query Language) (sql)

Za kulisami, SQL Server automatycznie tworzy indeks UNIQUE w celu wymuszenia unikalności danych przechowywanych w kolumnach, które uczestniczą w ograniczeniu UNIQUE. Dlatego też, jeśli spróbujesz wstawić zduplikowany wiersz, SQL Server odrzuci zmianę i zwróci komunikat o błędzie informujący, że ograniczenie UNIQUE zostało naruszone.

Poniższe wyrażenie wstawia nowy wiersz do tabeli hr.persons:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

Określenie działa zgodnie z oczekiwaniami. Jednak poniższe wyrażenie nie powiedzie się z powodu duplikatu wiadomości e-mail:

INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)

SQL Server wyświetlił następujący komunikat o błędzie:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Code language: Shell Session (shell)

Jeśli nie określisz osobnej nazwy dla ograniczenia UNIQUE, SQL Server automatycznie wygeneruje dla niego nazwę. W tym przykładzie, nazwa ograniczenia to UQ__persons__AB6E616417240E4E, co nie jest do końca czytelne.

Aby przypisać konkretną nazwę do ograniczenia UNIQUE, należy użyć słowa kluczowego CONSTRAINT w następujący sposób:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email));
Code language: SQL (Structured Query Language) (sql)

Istnieją następujące korzyści z przypisania UNIQUE constraint określonej nazwy:

  • Łatwiej sklasyfikować komunikat o błędzie.
  • Możesz odwołać się do nazwy ograniczenia, gdy chcesz je zmodyfikować.

Ograniczenie UNIQUE vs. PRIMARY KEY constraint

Mimo, że oba ograniczenia UNIQUE i PRIMARY KEY wymuszają unikalność danych, powinieneś użyć ograniczenia UNIQUE zamiast PRIMARY KEY gdy chcesz wymusić unikalność kolumny lub grupy kolumn, które nie są kolumnami klucza głównego.

Odmiennie od PRIMARY KEY ograniczeń, UNIQUE ograniczenia pozwalają NULL. Co więcej, UNIQUE constraints traktuje NULL jako zwykłą wartość, dlatego pozwala tylko na jeden NULL na kolumnę.

Poniższa instrukcja wstawia wiersz, którego wartością w kolumnie email jest NULL:

INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)

Teraz, jeśli spróbujesz wstawić jeszcze jeden NULL do kolumny email, otrzymasz błąd:

INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Code language: SQL (Structured Query Language) (sql)

Tutaj jest wyjście:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
Code language: SQL (Structured Query Language) (sql)

Ograniczenia UNIQUE dla grupy kolumn

Aby zdefiniować ograniczenie UNIQUE dla grupy kolumn, zapisujemy je jako ograniczenie tabeli z nazwami kolumn oddzielonymi przecinkami w następujący sposób:

CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
Code language: SQL (Structured Query Language) (sql)

Następujący przykład tworzy ograniczenie UNIQUE, które składa się z dwóch kolumn person_id i skill_id:

CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
Code language: SQL (Structured Query Language) (sql)

Dodaj ograniczenia UNIQUE do istniejących kolumn

Gdy dodajemy ograniczenie UNIQUE do istniejącej kolumny lub grupy kolumn w tabeli, SQL Server najpierw bada istniejące dane w tych kolumnach, aby upewnić się, że wszystkie wartości są unikalne. Jeśli SQL Server znajdzie zduplikowane wartości, wówczas zwraca błąd i nie dodaje ograniczenia UNIQUE.

Poniżej przedstawiono składnię dodawania ograniczenia UNIQUE do tabeli:

ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Code language: SQL (Structured Query Language) (sql)

Załóżmy, że masz następującą tabelę hr.persons:

CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20),);
Code language: SQL (Structured Query Language) (sql)

Następująca instrukcja dodaje ograniczenie UNIQUE do kolumny email:

ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
Code language: SQL (Structured Query Language) (sql)

Podobnie, poniższa instrukcja dodaje ograniczenie UNIQUE do kolumny phone:

ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Code language: SQL (Structured Query Language) (sql)

Delete UNIQUE constraints

Aby zdefiniować UNIQUE constraint, używamy instrukcji ALTER TABLE DROP CONSTRAINT w następujący sposób:

ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
Code language: SQL (Structured Query Language) (sql)

Następująca instrukcja usuwa ograniczenie unique_phone z tabeli hr.person:

ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Code language: SQL (Structured Query Language) (sql)

Modyfikacja ograniczeń UNIQUE

SerwerSQL nie posiada bezpośrednich instrukcji do modyfikacji ograniczeń UNIQUE , dlatego należy najpierw usunąć ograniczenie i odtworzyć je, jeśli chcemy zmienić ograniczenie.

W tym poradniku dowiedziałeś się, jak używać ograniczenia SQL Server UNIQUE do upewnienia się, że dane zawarte w kolumnie lub grupie kolumn są unikalne.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *