Какие ограничения (constraints) вы знаете в SQL?

«Какие ограничения (constraints) вы знаете в SQL?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ограничения в SQL — это правила, применяемые к данным в столбцах таблицы для обеспечения целостности данных (data integrity) и их точности. Вот основные типы с примерами:

  1. PRIMARY KEY (Первичный ключ):

    • Назначение: Уникально идентифицирует каждую строку в таблице. Не допускает NULL и дубликатов.
    • Пример:
      CREATE TABLE Users (
      Id INT PRIMARY KEY, -- Столбец Id — первичный ключ
      Username VARCHAR(50) NOT NULL
      );
  2. FOREIGN KEY (Внешний ключ):

    • Назначение: Обеспечивает ссылочную целостность. Связывает столбец/столбцы одной таблицы с первичным ключом другой, предотвращая действия, которые нарушили бы эту связь.
    • Пример:
      CREATE TABLE Orders (
      OrderId INT PRIMARY KEY,
      UserId INT, -- Этот столбец ссылается на Users.Id
      FOREIGN KEY (UserId) REFERENCES Users(Id) ON DELETE CASCADE
      );
  3. UNIQUE (Уникальность):

    • Назначение: Гарантирует, что все значения в столбце (или комбинации столбцов) различны. В отличие от PRIMARY KEY, допускает один NULL (зависит от СУБД).
    • Пример:
      CREATE TABLE Products (
      Id INT PRIMARY KEY,
      SKU VARCHAR(20) UNIQUE, -- Код товара должен быть уникальным
      Name VARCHAR(100)
      );
  4. 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'))
      );
  5. NOT NULL (Запрет NULL):

    • Назначение: Запрещает столбцу содержать NULL-значения. Это базовое ограничение для обязательных полей.
    • Пример:
      CREATE TABLE Customers (
      Id INT PRIMARY KEY,
      Email VARCHAR(100) NOT NULL, -- Email обязателен для заполнения
      Phone VARCHAR(20) -- Phone может быть NULL
      );
  6. DEFAULT (Значение по умолчанию):

    • Назначение: Устанавливает значение по умолчанию для столбца, если при вставке новое значение не указано.
    • Пример:
      CREATE TABLE Tasks (
      Id INT PRIMARY KEY,
      Description TEXT,
      Status VARCHAR(20) DEFAULT 'Pending', -- По умолчанию задача в статусе 'Pending'
      CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP -- Автоматическая дата создания
      );

Почему это важно: Ограничения переносят логику контроля данных на уровень БД, что защищает от ошибок в приложении и гарантирует согласованность данных даже при прямом доступе к базе.