Перейти до основного вмісту
Модуль 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

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 (SERIAL PRIMARY KEY), customer_id (INTEGER NOT NULL REFERENCES clients(id)), product_id (INTEGER NOT NULL REFERENCES products(id)), added_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 спроб