Перейти к основному содержимому
Модуль 8 · Урок 3 из 431/57 в курсе~12 min
Уроки модуля (3/4)

Создание таблиц и ограничений: DDL

До сих пор вы работали с таблицами, которые уже существуют (customers, orders…). DDL («Язык определения данных») относится к утверждениям, которые создавайте и изменяйте саму схему: таблицы, столбцы, ограничения, индексы.

CREATE TABLE: синтаксис

SQL
CREATE TABLE nome_tabella (
  colonna  TIPO  [vincoli_colonna],
  …,
  [vincoli_tabella]
);

Пример: список желаний, который связывает клиентов и продукты:

SQL
CREATE TABLE wishlists (
  id           SERIAL PRIMARY KEY,
  customer_id  INTEGER NOT NULL REFERENCES customers(id),
  product_id   INTEGER NOT NULL REFERENCES products(id),
  added_on     DATE NOT NULL DEFAULT CURRENT_DATE,
  note         TEXT,
  UNIQUE (customer_id, product_id)
);

Давайте разберем это по частям.

Наиболее распространенные виды

ТипЧто он содержит
INTEGER / INTЦелые числа (-2,1B … +2,1B)
BIGINTБольшие целые числа
NUMERIC(p, s)Точные десятичные дроби — деньги, проценты
TEXTСтроки переменной длины
VARCHAR(n)Строки максимальной длины n
BOOLEANTRUE / FALSE / NULL
DATEТолько дата
TIMESTAMPДата + время (без часового пояса)
TIMESTAMPTZДата + время с часовым поясом
SERIALINTEGER с автоинкрементной последовательностью

Ограничения

Ограничение — это правило, которое PostgreSQL применяет автоматически: если INSERT/UPDATE нарушает его, операция завершается с ошибкой.

SQL
PRIMARY KEY                         -- identifica univocamente la riga, non NULL
NOT NULL                            -- vieta NULL
UNIQUE                              -- vieta duplicati su questa colonna
REFERENCES tabella(colonna)         -- foreign key
CHECK (espressione_booleana)        -- es. CHECK (price > 0)
DEFAULT espressione                 -- valore di default se non fornito

Ограничения могут быть объявлены встроенными в столбце или на уровне таблицы. ограничения (под полями). Пример составного UNIQUE:

SQL
UNIQUE (customer_id, product_id)   -- niente coppia (cliente, prodotto) duplicata

ПРОВЕРИТЬ ограничение

CHECK применяет специальное правило:

SQL
CREATE TABLE stock_alerts (
  product_id   INTEGER PRIMARY KEY REFERENCES products(id),
  threshold    INTEGER NOT NULL CHECK (threshold >= 0),
  notify_email TEXT    NOT NULL,
  active       BOOLEAN NOT NULL DEFAULT true
);

threshold должно быть ≥ 0; если кто-то попробует INSERT … threshold = -5, это завершается с ошибкой ограничения.

Удаление и изменение

SQL
DROP TABLE wishlists;                                 -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists;                       -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;

Ваша очередь

Упражнение#sql.m8.l3.e1
Попыток: 0Загрузка…

Создайте таблицу списков желаний со следующими столбцами: id (ПОСЛЕДОВАТЕЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ), customer_id (ЦЕЛОЕ НЕ NULL ССЫЛКИ на клиентов (id)), Product_id (ЦЕЛОЕ НЕ NULL ССЫЛКИ на продукты (id)), add_on (DATE NOT NULL с DEFAULT CURRENT_DATE). Добавьте ограничение UNIQUE для пары (customer_id, Product_id).

Загрузка редактора…
Показать подсказку

UNIQUE (customer_id, Product_id) в качестве ограничения уровня таблицы внизу.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m8.l3.e2
Попыток: 0Загрузка…

Добавьте в таблицу клиентов столбец информационного бюллетеня типа BOOLEAN, NOT NULL, с значением DEFAULT false. Используйте один оператор ALTER TABLE.

Загрузка редактора…
Показать подсказку

Без DEFAULT ALTER завершится неудачно, поскольку строки уже существуют, а новый столбец НЕ NULL.

Решение доступно после 3 попыток