В SQL обмеження PRIMARY KEY використовується для унікальної ідентифікації рядків.
Обмеження PRIMARY KEY — це просто комбінація обмежень NOT NULL та UNIQUE. Це означає, що стовпець не може містити значення, що повторюються, а також значення NULL.
Синтаксис створення первинного ключа:
|
1 2 3 4 5 6 |
CREATE TABLE Colleges ( college_id INT, college_code VARCHAR(20) NOT NULL, college_name VARCHAR(50), CONSTRAINT CollegePK PRIMARY KEY (college_id) ); |
Тут стовпець college_id має первинний ключ. Це означає, що значення цього стовпця повинні бути унікальними, а також не містити значення NULL.
Примітка: Синтаксис створення первинного ключа може відрізнятися в різних СУБД.
Помилка первинного ключа
Якщо ми спробуємо вставити нульові або повторювані значення в стовпець з первинним ключем, то отримаємо помилку. Наприклад:
|
1 2 3 4 5 6 7 8 |
-- Перша операція вставки даних проходить успішно INSERT INTO Colleges(college_id, college_code, college_name) VALUES (1, "ARD12", "Star Public School"); -- Друга операція вставки даних - помилка у зв'язку з обмеженням UNIQUE. -- Значення college_id не є унікальним INSERT INTO Colleges(college_id, college_code, college_name) VALUES (1, "ARD12", "Star Public School"); |
Тут SQL видасть помилку, тому що не можна вставити повторюване значення для поля college_id через обмеження UNIQUE.
Примітка: У таблиці може бути лише один первинний ключ.
Первинний ключ для декількох стовпців
Первинний ключ можна додати відразу декільком стовпцям. Наприклад:
|
1 2 3 4 5 6 |
CREATE TABLE Colleges ( college_id INT, college_code VARCHAR(20), college_name VARCHAR(50), CONSTRAINT CollegePK PRIMARY KEY (college_id, college_code) ); |
Тут обмеження PRIMARY KEY з ім’ям CollegePK складається із стовпців college_id та college_code. Це означає, що стовпці college_id і college_code повинні мати унікальні значення і не можуть містити значення NULL.
Тепер спробуємо вставити дані до таблиці Colleges:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
-- Перша операція вставки даних проходить успішно INSERT INTO Colleges(college_id, college_code, college_name) VALUES (1, "ARD12", "Star Public School"); -- Друга операція вставки даних проходить успішно INSERT INTO Colleges(college_id, college_code, college_name) VALUES (2, "ARD13", "Star Public School"); -- Третя операція вставки даних - помилка у зв'язку з обмеженням UNIQUE. -- Стовпець college_id вже має значення 1, а стовпець college_code вже має значення "ARD12" INSERT INTO Colleges(college_id, college_code, college_name) VALUES (1, "ARD12", "Star Public School"); |
PRIMARY KEY з оператором ALTER TABLE
Ми також можемо додати обмеження PRIMARY KEY до стовпця в уже існуючій таблиці за допомогою оператора ALTER TABLE. Наприклад:
Для одного стовпця
|
1 2 |
ALTER TABLE Colleges ADD PRIMARY KEY (college_id); |
Для декількох стовпців
|
1 2 |
ALTER TABLE Colleges ADD CONSTRAINT CollegePK PRIMARY KEY (college_id, college_code); |
Тут ми додаємо обмеження PRIMARY KEY до вказаних стовпців у існуючій таблиці.
Автоінкремент первинного ключа
Звичайною практикою є автоматичне збільшення значення первинного ключа при вставці нового рядка. Наприклад:
SQL Server
|
1 2 3 4 5 6 7 8 9 10 11 12 |
-- Використовуємо IDENTITY(x, y) для автоінкремента первинного ключа. -- x -> початкове значення, y -> на скільки збільшувати значення CREATE TABLE Colleges ( college_id INT IDENTITY(1,1), college_code VARCHAR(20) NOT NULL, college_name VARCHAR(50), CONSTRAINT CollegePK PRIMARY KEY (college_id) ); -- Вставляємо рядок без вказування значення для college_id (первинний ключ) INSERT INTO Colleges(college_code, college_name) VALUES ("ARD13", "Star Public School"); |
Oracle
|
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 |
-- Створюємо послідовність чисел CREATE SEQUENCE auto_inc MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10; CREATE TABLE Colleges ( college_id INT, college_code VARCHAR(20) NOT NULL, college_name VARCHAR(50), CONSTRAINT CollegePK PRIMARY KEY (college_id) ); -- Створюємо тригер перед операцією вставки. -- Додаємо значення, що автоматично збільшується CREATE TRIGGER auto_inc_trigger BEFORE INSERT ON Colleges FOR EACH ROW BEGIN SELECT auto_inc.nextval INTO :new.college_id FROM dual END; -- Вставляємо рядок без вказування значення для college_id (первинний ключ) INSERT INTO Colleges(college_code, college_name) VALUES ("ARD13", "Star Public School"); |
MySQL
|
1 2 3 4 5 6 7 8 9 10 11 |
-- Ключове слово AUTO_INCREMENT автоматично збільшує значення CREATE TABLE Colleges ( college_id INT AUTO_INCREMENT, college_code VARCHAR(20) NOT NULL, college_name VARCHAR(50), CONSTRAINT CollegePK PRIMARY KEY (college_id) ); -- Вставляємо рядок без вказування значення для college_id (первинний ключ) INSERT INTO Colleges(college_code, college_name) VALUES ("ARD13", "Star Public School"); |
PostgreSQL
|
1 2 3 4 5 6 7 8 9 10 11 |
-- Ключове слово SERIAL автоматично збільшує значення CREATE TABLE Colleges ( college_id INT SERIAL, college_code VARCHAR(20) NOT NULL, college_name VARCHAR(50), CONSTRAINT CollegePK PRIMARY KEY (college_id) ); -- Вставляємо рядок без вказування значення для college_id (первинний ключ) INSERT INTO Colleges(college_code, college_name) VALUES ("ARD13", "Star Public School"); |
Видалити первинний ключ
Ми можемо видалити обмеження PRIMARY KEY у таблиці за допомогою оператора DROP. Наприклад:
SQL Server, Oracle
|
1 2 |
ALTER TABLE Colleges DROP CONSTRAINT CollegePK; |
MySQL
|
1 2 |
ALTER TABLE Colleges DROP PRIMARY KEY; |
Тут ми видаляємо обмеження PRIMARY KEY з таблиці Colleges.
