Kodokon kodokon.com

Создание схемы: CREATE TABLE и ограничения

Проектируй собственные таблицы с подходящими типами и ограничениями NOT NULL, UNIQUE и PRIMARY KEY, которые защищают твои данные.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

До сих пор ты запрашивал готовые таблицы; профессиональный разработчик их проектирует. Хорошая схема отклоняет некорректные данные в момент вставки: это твоя первая линия обороны, ещё до всякого кода приложения. В sqliteonline.com или sqlite3 создай эту таблицу:

SQL
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  username TEXT NOT NULL UNIQUE,
  created_at TEXT NOT NULL
    DEFAULT (datetime('now'))
);
Три ограничения: NOT NULL, UNIQUE и значение по умолчанию.

SQLite знает всего пять типов хранения: INTEGER, REAL, TEXT, BLOB и NULL. Даты хранятся в нём как TEXT в формате ISO (2026-07-04). В других СУБД (PostgreSQL, MySQL) ты объявил бы VARCHAR(255), TIMESTAMP или BOOLEAN: принцип тот же, меняются только названия типов. Теперь проверь свои ограничения:

SQL
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');

INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');
Вторая вставка падает: UNIQUE constraint failed.

Первичный ключ идентифицирует каждую строку: никогда не NULL, никогда не дублируется, только один на таблицу. В SQLite у INTEGER PRIMARY KEY есть ценная особенность: столбец автоинкрементируется, когда ты не указываешь значение, как во вставках выше. В PostgreSQL ты написал бы GENERATED ALWAYS AS IDENTITY, в MySQL - AUTO_INCREMENT. Наконец, добавь бизнес-правило через CHECK:

SQL
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  sku TEXT NOT NULL UNIQUE,
  price REAL NOT NULL CHECK (price >= 0)
);

INSERT INTO products (name, sku, price)
VALUES ('Keyboard', 'KB-01', -5);
Отклонено: CHECK constraint failed. Ни одна отрицательная цена не пройдёт.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Какое ограничение гарантирует, что в столбце email не появится дубликат?
    • NOT NULL
    • UNIQUE
    • CHECK
    • DEFAULT
  2. В чём разница между PRIMARY KEY и UNIQUE?
    • Никакой, это синонимы
    • Первичный ключ идентифицирует строку: только один на таблицу, никогда не NULL
    • UNIQUE строже, чем PRIMARY KEY
  3. В SQLite, что произойдёт, если вставить строку без значения для столбца INTEGER PRIMARY KEY?
    • Возникнет ошибка NOT NULL
    • SQLite автоматически сгенерирует уникальное целое число
    • Столбец останется NULL