„Каква е разликата между ограничение за първичен ключ и ограничение за уникален ключ?“
Това е може би най-често задаваният въпрос за интервю за работа от разработчиците на бази данни. В тази статия ще се опитаме да отговорим.
Нека започнем, като разгледаме какви са първичните и уникалните ключове, както и техните прилики.
Първичен ключ
Първичният ключ се използва за уникално идентифициране на всеки запис в таблицата. Всяка таблица трябва да има поне един първичен ключ. За да дефинирате първичен ключ в SQL сървър, просто трябва да използвате ключовите думи „Първичен ключ“ след името на колоната.
Уникален ключ
Колона с ограничение на уникален ключ може да съдържа само уникални стойности – това е резултат от уникалния ключ, забраняващ дублиращи се стойности да се съхраняват в колона.
За да дефинирате уникален ключ, трябва да добавите „Уникален“ към името на полето. Моля, имайте предвид, че не е задължително да имате уникален ключ в таблица.
Пример за създаване на първични и уникални ключове
Следният скрипт създава „Тестова“ база данни, която съдържа една таблица, наречена „Автомобили“.
Тази таблица ще има колона с първичен ключ, наречена „ID“ и уникална ключова колона, наречена „NumberPlate“.
CREATE DATABASE TEST GO USE TEST GO CREATE TABLE Cars ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int );
След това нека добавим няколко фиктивни записа към нашата таблица „Автомобили“. Изпълнете следния скрипт:
INSERT INTO Cars VALUES (1, 'Toyota', 'ABC 123', 199), (2, 'Toyota', 'ABC 345', 207), (3, 'Toyota', 'ABC 758', 205), (4, 'Toyota', 'ABC 741', 306), (5, 'Toyota', 'ABC 356', 124)
Преди да говорим за разликите, нека първо да разгледаме приликите между първичните и уникалните ключове.
Прилики между първични и уникални ключове
- Колоните с първични или уникални ключове не могат да имат дублиращи се стойности.
Нека се опитаме да добавим нов запис със стойност на ID 2 (който вече съществува) към таблицата „Автомобили“. Изпълнете следния скрипт:
INSERT INTO Cars VALUES (2, 'Toyota', 'ABC 345', 356)
Когато изпълните скрипта по-горе, ще се покаже следната грешка:
Грешката ясно казва, че този израз нарушава ограничението на първичния ключ и че дублиращи се стойности не могат да бъдат вмъкнати в колоната с първичен ключ.
По същия начин, нека се опитаме да вмъкнем дублирана стойност в колоната „NumberPlate“ с уникално ключово ограничение, като използваме следната заявка:
INSERT INTO Cars VALUES (6, 'Toyota', 'ABC 345', 356)
Този път ще видите, че има нарушение на ограничението за уникален ключ, тъй като стойността „ABC 345“ вече съществува в колоната „NumberPlate“, която има ограничение за уникален ключ. Съобщението за грешка ще изглежда така:
- Тъй като първичният ключ и уникалните колони не приемат дублиращи се стойности, те могат да се използват за уникално идентифициране на запис в таблицата. Това означава, че за всяка стойност в колоната с първичен или уникален ключ ще бъде върнат само един запис.
Разлики между първични и уникални ключове
Сега, когато разбрахме приликите между първичния и уникалния ключ, нека да разгледаме разликите между тях.
- Една таблица може да има само един първичен ключ, но няколко уникални ключа.
Следният пример ще ни помогне да разберем това по-добре.
В базата данни „Test“, която направихме по-рано, нека създадем нова таблица „Cars2“ с два първични ключа. За да направите това, изпълнете следния скрипт:
CREATE TABLE Cars2 ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int PRIMARY KEY );
В скрипта по-горе зададохме ограничения на първичния ключ върху колоните ID и Model. Въпреки това, тъй като само една колона в таблица може да има ограничение за първичен ключ, ще видите следната грешка:
Това съобщение за грешка ясно ни информира, че таблицата не може да има множество ограничения на първичен ключ.
Сега нека добавим множество уникални ключови ограничения към таблицата „Cars2“. Разгледайте следния скрипт:
CREATE TABLE Cars2 ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int UNIQUE );
Това ни позволява да добавим уникални ключови ограничения към колоните „NumberPlate“ и „Model“. Тъй като таблицата може да има множество колони с ограничения за уникални ключове, няма да видите никакви съобщения за грешка, когато изпълнявате горния скрипт.
- Колоната с първичен ключ не може да има нулеви стойности, докато колоната с уникален ключ може да има една нулева стойност.
Нека видим това в действие. Първо, нека добавим запис с нулева стойност към колона с първичен ключ в таблицата „Автомобили“. Вижте скрипта по-долу:
INSERT INTO Cars VALUES ( null, 'Toyota', 'ABC 345', 356)
Можете да видите, че този скрипт вмъква null като стойност в колоната ID. Когато го изпълните, трябва да видите следната грешка в прозореца на изходното съобщение:
Грешката ни казва, че нулева стойност не може да бъде вмъкната, тъй като колоната с първичен ключ не позволява нулеви стойности.
Нека сега се опитаме да добавим нулеви стойности към уникалната ключова колона „NumberPlate“. За да направите това, изпълнете следния скрипт:
INSERT INTO Cars VALUES ( 6, 'Toyota',null, 356)
Това добавя нов запис със стойност на идентификатор 6 и нулева стойност към таблицата „Cars“ – по-конкретно, нулевата стойност се присвоява на колоната „NumberPlate“. Ще видите, че горният скрипт ще се изпълни и ще бъде изпълнен без грешки, тъй като колоната с уникалния ключ може да приема нулеви стойности по подразбиране.
За да проверим дали нулевата стойност действително е била вмъкната в колоната „NumberPlate“, ще трябва да изберем всички записи от таблицата „Cars“ с помощта на следния скрипт:
SELECT * FROM Cars
В набора от резултати по-горе можем ясно да видим, че колоната на първичния ключ „ID“ не не съдържа никакви нулеви стойности. От друга страна, колоната „NumberPlate“ с уникално ключово ограничение съдържа нулева стойност, която току-що вмъкнахме. Не забравяйте, че не можете да добавите повече от една нулева стойност към колона с уникален ключ, тъй като втората нулева стойност ще бъде дубликат на първата – и дубликатите не са разрешени.
- По подразбиране в колоната с първичен ключ се създава уникален клъстериран индекс; от друга страна, в колоната с уникални ключове се създава уникален неклъстериран индекс.
За да видите индексите в таблицата „Автомобили“, изпълнете следния скрипт:
USE TEST GO sp_help Cars
В изхода ще видите подробности за таблицата „Автомобили“, включително индексите, както е показано на фигурата по-долу:
От фигурата по-горе можете да видите, че колоната „NumberPlate“ има неклъстериран уникален индекс, докато колоната ID има клъстериран уникален индекс.
Заключение
Въпреки няколко основни прилики, първичните и уникалните ключове имат значителни разлики. Можете да имате само един първичен ключ на таблица, но няколко уникални ключа. По същия начин колоната с първичен ключ не приема нулеви стойности, докато уникалните ключови колони могат да съдържат по една нулева стойност. И накрая, колоната с първичен ключ има уникален клъстериран индекс, докато колоната с уникален ключ има уникален неклъстериран индекс.