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

Ответ

Ограничения в 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 -- Автоматическая дата создания
      );

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

Ответ 18+ 🔞

Давай разберём эту скучную хуйню про SQL ограничения, чтобы ты не накосячил с базой как последний распиздяй.

Смотри, ограничения — это такие железные правила для твоих данных. Без них любая кривая рука из приложения или админки может так навернуть в базу, что потом будешь выгребать неделю. База сама должна уметь говорить «иди нахуй» некорректным данным.

  1. PRIMARY KEY (Первичный ключ) Это как паспорт для каждой строчки в таблице. Без него — анархия, нихуя не найдешь. Должен быть уникальным и не пустым, блять.

    CREATE TABLE Users (
        Id INT PRIMARY KEY, -- Вот эта штука. Дубликаты? Нет. NULL? Нахуй нет.
        Username VARCHAR(50) NOT NULL
    );
  2. FOREIGN KEY (Внешний ключ) А вот это уже святая святых, ссылочная целостность. Не даёт тебе удалить запись, на которую кто-то уже ссылается. Или, наоборот, заставляет удалять всё каскадом — зависит от настроения.

    CREATE TABLE Orders (
        OrderId INT PRIMARY KEY,
        UserId INT, -- Этот чувак должен чётко указывать на существующего юзера
        FOREIGN KEY (UserId) REFERENCES Users(Id) ON DELETE CASCADE -- Удалили юзера — все его заказы летят в пизду следом. Жестко, зато порядок.
    );
  3. UNIQUE (Уникальность) Почти как первичный ключ, но не главный. Например, почта или логин. Может быть один 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), -- Попробуй впихни 15-летнего или 100-летнего старикана. Получишь по ебалу от базы.
        Department VARCHAR(50) CHECK (Department IN ('IT', 'Sales', 'HR')) -- Отдел только из списка, никаких «Бухгалтерия-шаражки» нахуй.
    );
  5. NOT NULL (Запрет NULL) Проще некуда. Поле обязательно. Хочешь оставить пустым? Иди нахуй.

    CREATE TABLE Customers (
        Id INT PRIMARY KEY,
        Email VARCHAR(100) NOT NULL, -- Без мыла — не клиент. И точка.
        Phone VARCHAR(20) -- А вот телефон можешь и не оставить, бывает.
    );
  6. DEFAULT (Значение по умолчанию) Ленивое, но гениальное. Если не указал значение — база сама подставит то, что ты велел.

    CREATE TABLE Tasks (
        Id INT PRIMARY KEY,
        Description TEXT,
        Status VARCHAR(20) DEFAULT 'Pending', -- Создал задачу — она сразу «в ожидании». Не надо руками прописывать.
        CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP -- А дату создания база сама впишет, точнее тебя, лентяя.
    );

Зачем весь этот цирк? А затем, чувак, чтобы твоё приложение, даже если его писал дебил, не могло насрать в базу данных. Логика контроля — на самом низком, железном уровне. Прямой доступ через админку? Пофиг. Запрос от левой службы? Похуй. База сама всё отфильтрует и нахамит, если что не так. Целостность данных, ёпта. Без неё — пиздец и бардак.