Ответ
Ограничения в SQL — это правила, применяемые к данным в столбцах таблицы для обеспечения целостности данных (data integrity) и их точности. Вот основные типы с примерами:
-
PRIMARY KEY(Первичный ключ):- Назначение: Уникально идентифицирует каждую строку в таблице. Не допускает
NULLи дубликатов. - Пример:
CREATE TABLE Users ( Id INT PRIMARY KEY, -- Столбец Id — первичный ключ Username VARCHAR(50) NOT NULL );
- Назначение: Уникально идентифицирует каждую строку в таблице. Не допускает
-
FOREIGN KEY(Внешний ключ):- Назначение: Обеспечивает ссылочную целостность. Связывает столбец/столбцы одной таблицы с первичным ключом другой, предотвращая действия, которые нарушили бы эту связь.
- Пример:
CREATE TABLE Orders ( OrderId INT PRIMARY KEY, UserId INT, -- Этот столбец ссылается на Users.Id FOREIGN KEY (UserId) REFERENCES Users(Id) ON DELETE CASCADE );
-
UNIQUE(Уникальность):- Назначение: Гарантирует, что все значения в столбце (или комбинации столбцов) различны. В отличие от
PRIMARY KEY, допускает одинNULL(зависит от СУБД). - Пример:
CREATE TABLE Products ( Id INT PRIMARY KEY, SKU VARCHAR(20) UNIQUE, -- Код товара должен быть уникальным Name VARCHAR(100) );
- Назначение: Гарантирует, что все значения в столбце (или комбинации столбцов) различны. В отличие от
-
CHECK(Проверка):- Назначение: Проверяет, что значения в столбце удовлетворяют заданному логическому условию.
- Пример:
CREATE TABLE Employees ( Id INT PRIMARY KEY, Name VARCHAR(100), Age INT CHECK (Age >= 18 AND Age <= 70), -- Возраст в допустимом диапазоне Department VARCHAR(50) CHECK (Department IN ('IT', 'Sales', 'HR')) );
-
NOT NULL(Запрет NULL):- Назначение: Запрещает столбцу содержать
NULL-значения. Это базовое ограничение для обязательных полей. - Пример:
CREATE TABLE Customers ( Id INT PRIMARY KEY, Email VARCHAR(100) NOT NULL, -- Email обязателен для заполнения Phone VARCHAR(20) -- Phone может быть NULL );
- Назначение: Запрещает столбцу содержать
-
DEFAULT(Значение по умолчанию):- Назначение: Устанавливает значение по умолчанию для столбца, если при вставке новое значение не указано.
- Пример:
CREATE TABLE Tasks ( Id INT PRIMARY KEY, Description TEXT, Status VARCHAR(20) DEFAULT 'Pending', -- По умолчанию задача в статусе 'Pending' CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP -- Автоматическая дата создания );
Почему это важно: Ограничения переносят логику контроля данных на уровень БД, что защищает от ошибок в приложении и гарантирует согласованность данных даже при прямом доступе к базе.
Ответ 18+ 🔞
Давай разберём эту скучную хуйню про SQL ограничения, чтобы ты не накосячил с базой как последний распиздяй.
Смотри, ограничения — это такие железные правила для твоих данных. Без них любая кривая рука из приложения или админки может так навернуть в базу, что потом будешь выгребать неделю. База сама должна уметь говорить «иди нахуй» некорректным данным.
-
PRIMARY KEY(Первичный ключ) Это как паспорт для каждой строчки в таблице. Без него — анархия, нихуя не найдешь. Должен быть уникальным и не пустым, блять.CREATE TABLE Users ( Id INT PRIMARY KEY, -- Вот эта штука. Дубликаты? Нет. NULL? Нахуй нет. Username VARCHAR(50) NOT NULL ); -
FOREIGN KEY(Внешний ключ) А вот это уже святая святых, ссылочная целостность. Не даёт тебе удалить запись, на которую кто-то уже ссылается. Или, наоборот, заставляет удалять всё каскадом — зависит от настроения.CREATE TABLE Orders ( OrderId INT PRIMARY KEY, UserId INT, -- Этот чувак должен чётко указывать на существующего юзера FOREIGN KEY (UserId) REFERENCES Users(Id) ON DELETE CASCADE -- Удалили юзера — все его заказы летят в пизду следом. Жестко, зато порядок. ); -
UNIQUE(Уникальность) Почти как первичный ключ, но не главный. Например, почта или логин. Может быть один NULL, но два одинаковых значения — ни-ху-я.CREATE TABLE Products ( Id INT PRIMARY KEY, SKU VARCHAR(20) UNIQUE, -- Артикул. Два одинаковых? Да ты что, ёпта, склад с ума сойдёт. Name VARCHAR(100) ); -
CHECK(Проверка) Твоя собственная логика прямо в базе. Хочешь, чтобы возраст был адекватным? Пожалуйста.CREATE TABLE Employees ( Id INT PRIMARY KEY, Name VARCHAR(100), Age INT CHECK (Age >= 18 AND Age <= 70), -- Попробуй впихни 15-летнего или 100-летнего старикана. Получишь по ебалу от базы. Department VARCHAR(50) CHECK (Department IN ('IT', 'Sales', 'HR')) -- Отдел только из списка, никаких «Бухгалтерия-шаражки» нахуй. ); -
NOT NULL(Запрет NULL) Проще некуда. Поле обязательно. Хочешь оставить пустым? Иди нахуй.CREATE TABLE Customers ( Id INT PRIMARY KEY, Email VARCHAR(100) NOT NULL, -- Без мыла — не клиент. И точка. Phone VARCHAR(20) -- А вот телефон можешь и не оставить, бывает. ); -
DEFAULT(Значение по умолчанию) Ленивое, но гениальное. Если не указал значение — база сама подставит то, что ты велел.CREATE TABLE Tasks ( Id INT PRIMARY KEY, Description TEXT, Status VARCHAR(20) DEFAULT 'Pending', -- Создал задачу — она сразу «в ожидании». Не надо руками прописывать. CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP -- А дату создания база сама впишет, точнее тебя, лентяя. );
Зачем весь этот цирк? А затем, чувак, чтобы твоё приложение, даже если его писал дебил, не могло насрать в базу данных. Логика контроля — на самом низком, железном уровне. Прямой доступ через админку? Пофиг. Запрос от левой службы? Похуй. База сама всё отфильтрует и нахамит, если что не так. Целостность данных, ёпта. Без неё — пиздец и бардак.