Skip to content
Skip to content
Menu
Info Cafe
Info Cafe

SQLShack (Polski)

By admin on 8 marca, 2021

W tym artykule przybliżymy temat unikalnych ograniczeń w SQL, a także unikalnego indeksu w SQL Server. Po drodze przyjrzymy się różnicom między nimi.

Wprowadzenie

Constraints w SQL Server pozwala na definiowanie reguł na poziomie kolumny w tabeli SQL. Ograniczenie możemy dodać za pomocą instrukcji Create table lub Alter table. SQL Server wymusza właściwości ACID – Atomicity, Consistency, Isolation i Durability dla transakcji SQL Server.

Wykorzystujemy ograniczenia dla właściwości Consistency w ACID. Oznacza to, że tylko poprawne dane, które spełniają warunek powinny istnieć w bazie danych.

Możesz przejść przez ten artykuł, SQL Server Transaction Overview, aby dowiedzieć się o właściwościach ACID.

Właściwości ACID w SQL Server

Właściwości ACID w SQL Server

W tym artykule poznamy indeksy unikalne i ograniczenia unikalne. Omówimy również różnice pomiędzy nimi.

Przegląd ograniczeń UNIQUE w SQL Server

W SQL Server możemy zapewnić unikalną wartość w kolumnie. Może to być zarówno pojedyncza kolumna jak i kombinacja kolumn. Zapobiega to posiadaniu zduplikowanych wartości w kolumnach powiązanych z ograniczeniem unique. Możesz być zaznajomiony z kolumną klucza podstawowego, która również wymusza unikalną wartość w kolumnie. Możemy mieć tylko jeden klucz główny na tabelę w SQL Server.

Załóżmy, że mamy tabelę Pracownicy i jak sama nazwa wskazuje przechowuje ona wszystkie informacje o pracownikach. Mamy klucz główny dla tej kolumny. Tabela ta przechowuje również numer ubezpieczenia społecznego pracowników. Nie chcemy żadnych zduplikowanych wartości w tej kolumnie numeru ubezpieczenia społecznego. Nie mamy możliwości zdefiniowania klucza głównego, ponieważ nasza tabela już go posiada.

Twórzmy tabelę SQL za pomocą GUI SSMS. Rozwijamy bazę danych i klikamy prawym przyciskiem myszy na Tables-> New->Table.

Twórz nową tabelę

Twórz nową tabelę

Podaj kolumny, ich typ danych oraz usuń zaznaczenie dla kolumny Allow Nulls.

Projektant tabel

Projektant tabel

Kliknij prawym przyciskiem myszy na kolumnę i włącz klucz podstawowy klikając na niej przycisk Ustaw klucz podstawowy.

Ustaw klucz podstawowy

Ustaw klucz podstawowy

Ustawia symbol klucza dla kolumny z kluczem podstawowym, jak pokazano poniżej.

Symbol klucza głównego

Symbol klucza głównego

Teraz klikamy prawym przyciskiem myszy na kolumnie i wybieramy opcję Indeksy/Klucze.

Określenia w SQL: Indexes/keys

Określenia w SQL: Indexes/keys

Otwiera to następujący kreator indeksów/kluczy, który pokazuje istniejące indeksy jak mamy już klucz główny na tabeli.

Twórz nowy indeks SQL Server

Twórz nowy indeks SQL Server

Kliknij na Dodaj i możemy zdefiniować dodatkowe indeksy/ograniczenia za pomocą tego.

Primary Unique index

Primary Unique index

W grupie General wybieramy kolumnę, w której chcemy zdefiniować SQL Server Index. Możemy wybrać kolejność sortowania danych rosnąco (domyślnie) lub malejąco (domyślnie).

Porządek sortowania danych

Właściwości indeksu SQL Server możemy wybrać wartość dla właściwości – IsUnique.

właściwość

właściwość

W typie otrzymujemy możliwość wyboru spośród Unikalny klucz lub Indeks.

Wybierz Indeks lub Klucz unikalny

Wybierz Indeks lub Klucz unikalny

Wybierzmy Klucz unikalny i widzimy, że poprzednia opcja „Is Unique” jest wyszarzona. Nie możemy tutaj nic zmienić, ponieważ klucz unikalny jest dla unikalnej wartości w kolumnie.

Wybierz klucz unikalny

Wybierz klucz unikalny

SSMS daje możliwość wygenerowania skryptu do pracy, którą wykonaliśmy na GUI. Jest to dobra rzecz, szczególnie dla początkującego użytkownika, który musi nauczyć się zarówno GUI jak i t-SQL.

Generate change script

Generate change script

Kliknij na Generate Change Script…, a otrzymasz t-SQL dla Create table, add primary key constraint i add the unique constraint w SQL Server.

Konstrasty w SQL: Add primary key constraint

Constraints in SQL: Add primary key constraint

Skopiuj ten skrypt i zamknij okno projektanta tabel bez zapisywania go. Wygenerowany skrypt wykorzystujemy do utworzenia tabeli i unikalnego ograniczenia w SQL Server. Zmodyfikowałem nazwę tabeli, aby miała odpowiednią nazwę dla naszego demo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET. NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Employee
(
EmployeeID int NOT NULL,
EmpName varchar(50) NOT NULL,
SocialSecurityNumber int NOT NULL
) ON
GO
ALTER TABLE dbo.Employee ADD CONSTRAINT
PK_Table_1 PRIMARY KEY CLUSTERED
(
EmployeeID
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON
GO
ALTER TABLE dbo.Employee ADD CONSTRAINT
IX_Unique_SSN UNIQUE NONCLUSTERED
(
SocialSecurityNumber
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON
GO
ALTER TABLE dbo.Employee SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

Przegląd skryptu

Wykonanie powyższego skryptu, a on utworzy tabelę, klucz główny i ograniczenie klucza unikalnego. Tworzy on indeks SQL Server dla ograniczeń klucza głównego i unikalnego. Możemy sprawdzić istniejące indeksy na tabeli za pomocą systemowej procedury składowanej sys.sp_helpindex.

1
2

EXEC sys.sp_helpindex @objname = N’Employee'
GO

Systemowa procedura składowana

Systemowa procedura składowana

Spróbujmy wstawić kilka wartości do tej tabeli i zobaczmy, czy wolno nam wprowadzić duplikaty w kolumnie.

W poniższym zapytaniu Ram próbuje wprowadzić wartość do kolumny, która jest już dostępna dla pracownika Raj.

.

1
2
3

Wstaw do Pracownik values(1,’Raj',1111)
Wstaw do Employee values(2,’Shyam',2222)
Insert into Employee values(3,’Ram',1111)

Wstawia pierwsze dwa wiersze pomyślnie, ale dla trzeciego wiersza otrzymujemy komunikat o naruszeniu ograniczenia klucza unikalnego. Otrzymujesz również zduplikowaną wartość w danych wyjściowych. Pomaga to szybko zidentyfikować problematyczne instrukcje wstawiania powodujące problemy.

Klucz unikalny

Wyłączanie ograniczeń unikalnych w SQL Server

Możemy wyłączyć ograniczenie unikalne używając następującej instrukcji ALTER table.

1
2
3

ALTER TABLE Employee
NOCHECK CONSTRAINT ALL
GO

To polecenie zostało wykonane pomyślnie.

Unique Constraint in SQL Server

Unique Constraint in SQL Server

Jeśli spróbujemy wprowadzić zduplikowaną wartość, nadal otrzymamy ten sam komunikat o błędzie.

komunikat o błędzie

Wiemy, że unikalne ograniczenie w SQL Server tworzy również unikalny indeks SQL Server. SQL Server pozwala nam również na wyłączenie indeksu bez jego upuszczania.

Kliknij prawym przyciskiem myszy na indeksie SQL Server, który chcemy wyłączyć i kliknij na Disable jak pokazano poniżej.

Constraints in SQL: Disable index

Constraints in SQL: Disable index

Alternatywnie możemy użyć polecenia ALTER INDEX i wyłączyć indeks serwera SQL. W tym zapytaniu należy podać nazwę indeksu oraz nazwę tabeli.

1
2

ALTER INDEX IX_Unique_SSN ON Employee
DISABLE

Pozwala na wprowadzenie zduplikowanej wartości w kolumnie.

Duplicate values

Duplicate values

Mamy zduplikowaną wartość w tabeli. Włączmy unikalny indeks nieklastrowany. Aby włączyć Indeks, musimy go przebudować.

Aby przebudować indeks, kliknij prawym przyciskiem myszy na Indeks i wybierz polecenie REBUILD z jego właściwości.

REBUILD index

REBUILD index

Możemy również przebudować indeks za pomocą poniższego polecenia ALTER INDEX.

1
2
3

Użyj
GO
ALTER INDEX ON . REBUILD

Nie możemy włączyć indeksu, ponieważ istnieje zduplikowany klucz, a ograniczenie unikalnego klucza nie pozwala na duplikaty. Daje to również zduplikowane klucze na wyjściu.

Błąd zduplikowanego klucza

Błąd zduplikowanego klucza

Upuszczanie unikalnych ograniczeń w SQL Server

Nie możemy upuścić unikalnego Indeksu utworzonego przez unikalne ograniczenia. Jeśli próbujemy to zrobić, daje następujący komunikat o błędzie. Nie pozwala on na jawne upuszczenie indeksu, ponieważ unikalne ograniczenie używa indeksu.

1
2

DROP INDEX Pracownik.
GO

Odrzuć ograniczenie Unique

.Drop a Unique constraint

Indeks możemy zrzucić za pomocą polecenia Alter Table Drop Constraint. Jak wiemy, SQL Server tworzy indeks z unikalnym ograniczeniem w SQL Server. To polecenie usuwa indeks wraz z ograniczeniem.

1
2

ALTER TABLE Pracownik
DROP CONSTRAINT IX_Unique_SSN;

Na poniższym zrzucie ekranu możemy zweryfikować, że Indeks nie istnieje obecnie.

Weryfikuj indeks

Weryfikuj indeks

Daje to dodatkową korzyść, że nikt nie może przypadkowo usunąć unikalnego Indeksu utworzonego przez unikalne ograniczenie.

Unikalny indeks w SQL Server

Poprzednio utworzyliśmy unikalne ograniczenia w SQL Server za pomocą metody SSMS GUI. Nie mamy żadnych istniejących unikalnych ograniczeń dla tabeli.

Kliknij prawym przyciskiem myszy na tabelę i wybierz Projekt. Otworzy nam się projekt tabeli, tak jak to widzieliśmy wcześniej.

Indeks unikalny w SQL Server

Indeks unikalny w SQL Server

Kliknij prawym przyciskiem myszy na , wybierz Indeks/klucze i wybierz Indeks z kolumny Typ. Dla unikalnego indeksu wybieramy wartość Tak dla kolumny.

Typ indeksu

Typ indeksu

Mamy również włączone kilka opcji dla unikalnych Indeksów takich jak Ignoruj zduplikowane klucze oraz Ponownie oblicz statystyki.

Ignoruj zduplikowane klucze

Ignoruj zduplikowane klucze

Zamknij stronę indeksu/kluczy i wygeneruj skrypt. Możesz zobaczyć, że tworzy on unikalny indeks nieklastrowy dla tabeli.

Określenia w SQL: View script

Constraints w SQL: View script

Kliknij Ok i zapisz modyfikacje, które zrobiłeś. Otrzymujesz komunikat o błędzie, ponieważ znalazł duplikat klucza dla kolumny.

Zapisz modyfikacje

Zapisz modyfikacje

Możemy usunąć duplikat, a to tworzy Indeks dla Ciebie.

View index and index keys

View index and index keys

Różnica między unikalnymi indeksami a unikalnymi ograniczeniami w SQL Server

Zarówno unikalny indeks jak i unikalne ograniczenie są podobne i nie ma między nimi różnicy funkcjonalnej. Optymalizator zapytań również używa indeksu unikalnego do tworzenia planów wykonania zoptymalizowanych pod względem kosztów. Jedyną różnicą jest to, że nie można bezpośrednio upuścić unikalnego indeksu utworzonego przez unikalne ograniczenie w SQL Server. Otrzymujemy również kilka dodatkowych opcji indeksu po bezpośrednim utworzeniu unikalnego indeksu.

Jak wiemy, ograniczenia są jak reguły biznesowe dla danych przechowywanych w tabelach SQL Server. Powinieneś utworzyć unikalne ograniczenie, gdy nie masz bezpośrednio do czynienia z indeksem. Nie powinieneś jednak definiować unikalnego ograniczenia i klucza dla podobnych kolumn. Może to spowolnić zapytania, a także zduplikować indeksy.

Różnica indeksów

Różnica indeksów

Nie możemy odróżnić unikalnego klucza od indeksu patrząc na indeksy w GUI. Oba istnieją w tym samym folderze indeksów w bazie danych.

Klucz unikalny

Klucz unikalny

Jednak SQL Server zna różnicę. Jeśli wykonamy skrypt dla obu indeksów, można zobaczyć różne skrypty dla obu indeksów. Jak widzimy poniżej, pierwszy skrypt używa klauzuli alter table with Add Constraint dla unikalnego ograniczenia w SQL Server, podczas gdy późniejsza część używa instrukcji Create Non-Clustered Index.

Constraints in SQL: Non-Clustered Index

Mimo to, otrzymujesz kilka dodatkowych korzyści z unikalnym indeksem utworzonym jawnie nad Unique Constraints w SQL Server.

  • Możesz zawrzeć kolumny w nieklastrowanym unikalnym indeksie, aby poprawić wydajność zapytania. SQL Server wymusza unikalność tylko dla kolumny klucza unikalnego indeksu
  • Możemy dodać filtr w unikalnym indeksie. Może to być przydatne, jeśli chcemy utworzyć unikalny indeks na kolumnie, która dopuszcza wartości NULL. W tym przypadku, możemy mieć wiele wartości NULL, ponieważ unikalny indeks zostanie utworzony dla wartości non-null
  • Możemy również zdefiniować klucz obcy, który odwołuje się do unikalnego indeksu

Podsumowanie

W tym artykule, zbadaliśmy unikalne ograniczenia i unikalne indeksy w SQL Server. Otrzymujemy unikalny indeks, jeśli tworzymy unikalny warunek. Możesz zdecydować, która opcja będzie dla Ciebie odpowiednia, ponieważ nie ma różnicy w wydajności zapytań.

  • Autor
  • Recent Posts
Rajendra Gupta
Jako certyfikowany MCSA i Microsoft Certified Trainer w Gurgaon, Indie, z 13-letnim doświadczeniem, Rajendra pracuje dla różnych dużych firm, koncentrując się na optymalizacji wydajności, monitorowaniu, wysokiej dostępności i strategii odzyskiwania danych po awarii oraz ich wdrażaniu. Jest autorem setek autorytatywnych artykułów na temat SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS/Amazon RDS, Git i pokrewnych technologii, które do tej pory zostały obejrzane przez ponad 10 milionów czytelników. est twórcą jednego z największych darmowych zbiorów artykułów online na jeden temat, z jego 50-częściową serią na temat SQL Server Always On Availability Groups. W oparciu o jego wkład w społeczność SQL Server, został wyróżniony różnymi nagrodami, w tym prestiżową nagrodą „Najlepszy autor roku” nieprzerwanie w 2020 i 2021 roku na SQLShack.
Raj jest zawsze zainteresowany nowymi wyzwaniami, więc jeśli potrzebujesz pomocy doradczej na dowolny temat poruszony w jego pismach, można go osiągnąć pod adresem [email protected]
View all posts by Rajendra Gupta

Rajendra Gupta
Latest posts by Rajendra Gupta (see all)
  • Konfiguracja długoterminowej retencji kopii zapasowych dla bazy danych Azure SQL – 25 marca, 2021
  • Tworzenie spójnej transakcyjnie kopii bazy danych Azure SQL – 22 marca, 2021
  • Przegląd Azure Cloud Shell – 18 marca, 2021

Zobacz wpisy

Czym są powięzi?
Jak mogę ćwiczyć język migowy dla niemowląt?

Dodaj komentarz Anuluj pisanie odpowiedzi

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

Najnowsze wpisy

  • Firebush (Polski)
  • Prognoza stawek CD na 2021 rok: Stopy procentowe prawdopodobnie pozostaną na niskim poziomie, ale mogą wzrosnąć w dalszej części roku
  • Jak ustrukturyzować dokumentację systemu zarządzania jakością
  • Zdrowe Gry i Zajęcia dla Dzieci | UIC Online Informatics
  • Wheat Ales (American) (Polski)
  • Korzyści z karmienia piersią po roku
  • Czy bezpiecznie jest wrzucać fusy z kawy do zlewu | Atomic Plumbing
  • Cool-Down After Your Workout (Polski)
  • Nasza praca
  • Najlepsza ręczna maszyna do szycia do kupienia: 2020

Meta

  • Zaloguj się
  • Kanał wpisów
  • Kanał komentarzy
  • WordPress.org

Archiwa

  • Marzec 2021
  • Luty 2021
  • Styczeń 2021
  • Grudzień 2020
  • DeutschDeutsch
  • NederlandsNederlands
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • PolskiPolski
  • 日本語日本語
©2021 Info Cafe | WordPress Theme by SuperbThemes.com