Уроки модуля (3/4)
Создание таблиц и ограничений: DDL
До сих пор вы работали с таблицами, которые уже существуют (customers,
orders…). DDL («Язык определения данных») относится к утверждениям, которые
создавайте и изменяйте саму схему: таблицы, столбцы, ограничения,
индексы.
CREATE TABLE: синтаксис
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Пример: список желаний, который связывает клиентов и продукты:
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 |
BOOLEAN | TRUE / FALSE / NULL |
DATE | Только дата |
TIMESTAMP | Дата + время (без часового пояса) |
TIMESTAMPTZ | Дата + время с часовым поясом |
SERIAL | INTEGER с автоинкрементной последовательностью |
Ограничения
Ограничение — это правило, которое PostgreSQL применяет автоматически: если
INSERT/UPDATE нарушает его, операция завершается с ошибкой.
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:
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataПРОВЕРИТЬ ограничение
CHECK применяет специальное правило:
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, это
завершается с ошибкой ограничения.
Удаление и изменение
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;Ваша очередь
Создайте таблицу списков желаний со следующими столбцами: 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 попыток
Обзор упражнения
Добавьте в таблицу клиентов столбец информационного бюллетеня типа BOOLEAN, NOT NULL, с значением DEFAULT false. Используйте один оператор ALTER TABLE.
Показать подсказку
Без DEFAULT ALTER завершится неудачно, поскольку строки уже существуют, а новый столбец НЕ NULL.
Решение доступно после 3 попыток