← Назад к вопросам

Какие знаешь SQL Constraints?

1.6 Junior🔥 141 комментариев
#Работа с данными

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SQL Constraints: Типы и их применение

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

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

Уникально идентифицирует каждую запись в таблице. Значения не могут повторяться или быть NULL. В SQLite автоматически создаётся скрытый индекс для ускорения поиска.

CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL
);
  • Особенность для Android: В SQLite AUTOINCREMENT гарантирует уникальность, но лучше полагаться на ROWID по умолчанию для производительности.

2. FOREIGN KEY (Внешний ключ)

Обеспечивает ссылочную целостность между таблицами. Связывает поле с PRIMARY KEY другой таблицы.

CREATE TABLE Orders (
    order_id INTEGER PRIMARY KEY,
    user_id INTEGER,
    FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE
);
  • Android-нюанс: В SQLite поддержка FOREIGN KEY отключена по умолчанию. Нужно включать через PRAGMA foreign_keys = ON;.
  • ON DELETE CASCADE автоматически удаляет связанные записи, что упрощает поддержку целостности.

3. UNIQUE (Уникальность)

Гарантирует, что все значения в столбце различны. Может применяться к нескольким столбцам.

CREATE TABLE Products (
    product_code TEXT UNIQUE,
    name TEXT
);
  • Использование: Например, для email или логина пользователя в локальной кеш-таблице.

4. NOT NULL (Запрет NULL)

Запрещает хранение NULL в столбце. Часто комбинируется с другими ограничениями.

CREATE TABLE Employees (
    employee_id INTEGER PRIMARY KEY,
    full_name TEXT NOT NULL
);
  • Важно: В SQLite столбец с PRIMARY KEY неявно имеет NOT NULL, но явное указание улучшает читаемость.

5. CHECK (Проверка условия)

Задаёт логическое условие для значений в столбце. Например, проверка диапазона или формата.

CREATE TABLE Students (
    student_id INTEGER PRIMARY KEY,
    age INTEGER CHECK (age >= 16 AND age <= 100)
);
  • Пример из практики Android: Проверка, что поле rating в таблице отзывов находится в диапазоне 1–5.

6. DEFAULT (Значение по умолчанию)

Устанавливает значение по умолчанию для столбца, если при вставке оно не указано.

CREATE TABLE Logs (
    log_id INTEGER PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • Полезно: Для автоматической записи времени создания или обновления данных.

7. COLLATE (Сопоставление)

Определяет правила сортировки и сравнения строк, например, для регистронезависимого поиска.

CREATE TABLE Tags (
    tag_name TEXT COLLATE NOCASE UNIQUE
);

Применение в Android с Room ORM

В Android-разработке constraints активно используются через Room Persistence Library. Room позволяет декларативно задавать ограничения через аннотации, что повышает надёжность и читаемость кода.

@Entity(
    tableName = "notes",
    foreignKeys = [ForeignKey(
        entity = User::class,
        parentColumns = ["id"],
        childColumns = ["author_id"],
        onDelete = CASCADE
    )],
    indices = [Index(value = ["title"], unique = true)]
)
data class Note(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val title: String,
    @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP") val created_at: String,
    val author_id: Int
)

Ключевые выводы для Android Developer:

  • Производительность: Индексы, создаваемые для PRIMARY KEY и UNIQUE, ускоряют запросы, но могут замедлять вставку.
  • Целостность данных: FOREIGN KEY и NOT NULL предотвращают «мусорные» данные, что критично для офлайн-работы приложения.
  • Безопасность типов: CHECK и DEFAULT снижают риски ошибок в бизнес-логике.
  • Совместимость: SQLite поддерживает не все constraints из стандарта SQL (например, частичные ограничения), но этого достаточно для большинства мобильных сценариев.

Использование constraints — это проактивная защита от аномалий данных, которая экономит время на отладке и обеспечивает стабильность приложения при работе с большими наборами данных.