Что такое SQL-ограничения (constraints) и какие основные типы существуют?

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

Ответ

SQL-ограничения (constraints) — это правила, применяемые к столбцам или таблицам для обеспечения целостности и точности данных. Они предотвращают вставку некорректных данных на уровне базы данных.

Основные типы ограничений:

  1. NOT NULL — запрещает столбцу содержать значения NULL.

    CREATE TABLE users (
        id INT NOT NULL,
        username VARCHAR(50) NOT NULL
    );
  2. UNIQUE — гарантирует, что все значения в столбце (или комбинации столбцов) различны.

    CREATE TABLE users (
        email VARCHAR(100) UNIQUE
    );
    -- Или для нескольких столбцов:
    ALTER TABLE users ADD CONSTRAINT uc_name UNIQUE (first_name, last_name);
  3. PRIMARY KEY — комбинация NOT NULL и UNIQUE. Однозначно идентифицирует каждую строку в таблице.

    CREATE TABLE orders (
        order_id INT PRIMARY KEY
    );
  4. FOREIGN KEY — обеспечивает ссылочную целостность. Связывает столбец с PRIMARY KEY другой таблицы.

    CREATE TABLE orders (
        user_id INT,
        FOREIGN KEY (user_id) REFERENCES users(id)
    );
  5. CHECK — проверяет, что значения в столбце удовлетворяют заданному условию.

    CREATE TABLE products (
        price DECIMAL(10,2) CHECK (price > 0),
        quantity INT CHECK (quantity >= 0)
    );
  6. DEFAULT — задает значение по умолчанию для столбца при вставке новой строки, если значение не указано.

    CREATE TABLE logs (
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        status VARCHAR(20) DEFAULT 'PENDING'
    );

Практическое применение: Ограничения можно задавать при создании таблицы (CREATE TABLE) или добавить/изменить позже с помощью ALTER TABLE. Их использование критически важно для предотвращения "мусорных" данных, но может незначительно влиять на производительность операций INSERT/UPDATE из-за дополнительных проверок.