Объясните разницу между первичным ключом, внешним ключом, уникальным ключом и проверочным ограничением в SQL. Приведите пример для каждого ключа и ограничения, чтобы проиллюстрировать их использование в таблице базы данных.
Подсказки:
- Первичный ключ однозначно идентифицирует каждую строку в таблице и не может содержать NULL-значения.
- Внешний ключ устанавливает связь между двумя таблицами и гарантирует реляционную целостность данных.
- Уникальный ключ гарантирует, что все значения в столбце отличаются друг от друга, за исключением NULL-значений.
- Проверочное ограничение ограничивает значения, которые может содержать столбец, на основе заданного условия.
Выше ожиданий:
- Знает, что своставны ключи — это первичные ключи, состоящие более чем из одного столбца и что они реализуют
- Знает про каскадные действия
- Знает что, уникальные ограничения могут применяться к нескольким столбцам
- Упомянл, что проверочное ограничение может обеспечивать сложные условия с использованием выражений
- Понимает, что SQL поддерживает defferable (откладываемые) ограничения
Первичный ключ (primary key, PK) — это столбец или комбинация столбцов, используемые для уникальной идентификации каждой строки в таблице. Он не может содержать значений NULL, гарантируя, что каждая запись является уникальной. Первичный ключ часто создается при определении таблицы и имеет решающее значение для поддержания целостности данных.
Пример:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
В этом примере EmployeeID
является первичным ключом, который уникально идентифицирует каждого сотрудника.
Внешний ключ (foreign key, FK) — это поле (или набор полей) в одной таблице, которое ссылается на первичный ключ в другой таблице. Цель внешнего ключа — обеспечить реляционную целостность между двумя таблицами, то есть, чтобы связь между таблицами была согласованной.
Пример:
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DepartmentID INT,
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);
Здесь DepartmentID
в таблице Employees
является внешним ключом, который ссылается на DepartmentID
в таблице Departments
, поддерживая связь между сотрудниками и их соответствующими отделами.
Ограничение уникального ключа гарантирует, что все значения в столбце отличаются друг от друга. В отличие от первичного ключа, уникальный ключ может содержать значения NULL, но только одно значение NULL разрешено на столбец.
Пример:
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Email VARCHAR(100) UNIQUE,
Username VARCHAR(50) UNIQUE
);
В этой таблице как Email
, так и Username
определены как уникальные ключи, гарантируя, что у двух пользователей не может быть одинакового email или имени пользователя.
Ограничение CHECK ограничивает значения, которые может содержать столбец, на основе заданного условия. Оно используется для обеспечения того, что данные в столбце соответствуют определенным критериям перед добавлением в таблицу.
Пример:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Price DECIMAL(10, 2),
CHECK (Price >= 0)
);
Ограничение CHECK в этом случае гарантирует, что цена продукта не может быть отрицательной, накладывая бизнес-правило, что цены должны быть нулевыми или положительными.
Составной ключ (или композитный) — это первичный ключ, состоящий из более чем одного столбца, позволяющий комбинации значений уникально идентифицировать запись.
Пример:
CREATE TABLE OrderDetails (
OrderID INT,
ProductID INT,
Quantity INT,
PRIMARY KEY (OrderID, ProductID)
);
В этой таблице комбинация OrderID
и ProductID
служит составным ключом для уникальной идентификации каждой детали заказа.
Каскадные действия
Каскадные действия, такие как ON DELETE CASCADE
, могут быть определены для внешних ключей, чтобы поддерживать целостность данных, автоматически удаляя или обновляя связанные записи.
Пример:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE
);
Здесь, если клиент удаляется из таблицы Customers
, все его связанные заказы в таблице Orders
также будут автоматически удалены.
Откладываемые (deferrable) ограничения
SQL поддерживает откладываемые ограничения, которые могут быть временно отключены во время транзакции, чтобы разрешить определенные операции, которые в противном случае нарушили бы ограничения. Это полезно для сложных транзакций, где ограничения должны проверяться в конце, а не на каждом шаге.