В 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.