Пошук уроків, статей та іншого контенту
Створимо таблицю за допомогою CREATE TABLE, визначимо типи даних і додамо обмеження для її стовпців.
Таблиця в PostgreSQL зберігає дані у вигляді рядків і стовпців:
стовпець описує властивість даних;
рядок містить один запис;
тип даних визначає, які значення можна зберігати у стовпці;
обмеження контролюють коректність значень.
Наприклад, для зберігання користувачів можуть знадобитися такі стовпці:
ідентифікатор;
ім’я;
електронна пошта;
дата народження;
статус активності;
дата створення запису.
CREATE TABLEДля створення таблиці використовується команда CREATE TABLE:
CREATE TABLE назва_таблиці (
назва_стовпця тип_даних,
назва_іншого_стовпця тип_даних
);Кожен опис стовпця складається з:
назви;
типу даних;
необов’язкових обмежень.
Стовпці розділяються комами, а вся команда завершується крапкою з комою.
Розглянемо типи, які часто використовуються в першій таблиці.
integerЦіле число:
age integerПідходить для віку, кількості товарів або ідентифікаторів.
textТекст довільної довжини:
name textУ PostgreSQL тип text зазвичай зручніший за varchar, якщо немає спеціальної потреби обмежувати довжину тексту.
varchar(n)Текст із максимальною довжиною:
code varchar(20)Значення не може містити більше ніж 20 символів.
booleanЛогічне значення true або false:
is_active booleandateДата без часу:
birth_date datetimestamptzДата й час із часовою зоною:
created_at timestamptzДля часу створення записів часто використовують значення за замовчуванням now().
numeric(10, 2)Точне десяткове число:
balance numeric(10, 2)Перше число визначає загальну кількість цифр, а друге — кількість цифр після десяткової крапки. Наприклад, numeric(10, 2) може зберігати значення 12345678.90.
Обмеження допомагають не допустити некоректні дані.
PRIMARY KEYПервинний ключ однозначно ідентифікує кожен рядок таблиці.
id integer PRIMARY KEYПервинний ключ:
не може містити NULL;
має бути унікальним;
ідентифікує один конкретний запис.
Для автоматичної генерації ідентифікаторів у PostgreSQL можна використати GENERATED ALWAYS AS IDENTITY:
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEYТоді PostgreSQL автоматично створюватиме значення id.
NOT NULLЗабороняє залишати стовпець порожнім:
name text NOT NULLКожен рядок повинен містити значення name.
UNIQUEВимагає, щоб значення не повторювалися:
email text UNIQUEДва записи не можуть мати однакову електронну пошту.
UNIQUE допускає значення NULL, якщо додатково не вказано NOT NULL.
DEFAULTВстановлює значення, якщо його не передали під час додавання рядка:
is_active boolean NOT NULL DEFAULT trueЯкщо is_active не вказати, PostgreSQL збереже true.
CHECKПеревіряє значення за заданою умовою:
balance numeric(10, 2) CHECK (balance >= 0)Тепер у balance не можна записати від’ємне число.
Створимо таблицю app_users для користувачів застосунку:
CREATE TABLE app_users (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
full_name text NOT NULL,
email text NOT NULL UNIQUE,
birth_date date,
is_active boolean NOT NULL DEFAULT true,
balance numeric(10, 2) NOT NULL DEFAULT 0
CHECK (balance >= 0),
created_at timestamptz NOT NULL DEFAULT now()
);У цій таблиці:
id автоматично генерується та є первинним ключем;
full_name є обов’язковим;
email є обов’язковим і не може повторюватися;
birth_date може бути порожнім;
is_active за замовчуванням має значення true;
balance за замовчуванням дорівнює 0 і не може бути від’ємним;
created_at автоматично отримує поточні дату й час.
Після виконання команди PostgreSQL створить порожню таблицю. Опис її структури можна переглянути в psql командою:
\d app_usersКоманда \d є командою клієнта psql, а не SQL-командою.
Спробуємо додати коректний запис:
INSERT INTO app_users (full_name, email, birth_date, balance)
VALUES ('Олена Коваль', 'olena@example.com', '1995-04-12', 250.50);Стовпці id, is_active і created_at ми не вказали:
id буде згенеровано автоматично;
is_active отримає значення true;
created_at отримає поточний час.
Переглянемо запис:
SELECT *
FROM app_users;Тепер спробуємо додати користувача без імені:
INSERT INTO app_users (email)
VALUES ('another@example.com');Ця команда завершиться помилкою, тому що full_name має обмеження NOT NULL.
Спроба додати повторну електронну пошту також завершиться помилкою:
INSERT INTO app_users (full_name, email)
VALUES ('Інший користувач', 'olena@example.com');Причина — обмеження UNIQUE для стовпця email.
Так само не можна додати від’ємний баланс:
INSERT INTO app_users (full_name, email, balance)
VALUES ('Петро Бондар', 'petro@example.com', -10);Значення порушує умову CHECK (balance >= 0).
Наведений приклад можна виконати в PostgreSQL як один скрипт:
-- Видаляємо таблицю, якщо вона вже існує, щоб приклад можна було повторити
DROP TABLE IF EXISTS app_users;
-- Створюємо таблицю користувачів
CREATE TABLE app_users (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
full_name text NOT NULL,
email text NOT NULL UNIQUE,
birth_date date,
is_active boolean NOT NULL DEFAULT true,
balance numeric(10, 2) NOT NULL DEFAULT 0
CHECK (balance >= 0),
created_at timestamptz NOT NULL DEFAULT now()
);
-- Додаємо коректний запис
INSERT INTO app_users (full_name, email, birth_date, balance)
VALUES ('Олена Коваль', 'olena@example.com', '1995-04-12', 250.50);
-- Переглядаємо всі записи
SELECT *
FROM app_users;Команда DROP TABLE IF EXISTS потрібна лише для повторного запуску навчального прикладу. У реальному проєкті не слід видаляти таблицю без необхідності, оскільки разом із нею можуть бути видалені всі дані.
Неправильно:
CREATE TABLE app_users (
id integer
full_name text
);Між описами стовпців потрібна кома:
CREATE TABLE app_users (
id integer,
full_name text
);SQL-команду зазвичай завершують символом ;:
CREATE TABLE app_users (
id integer
);NOT NULLЯкщо стовпець має NOT NULL, під час INSERT потрібно передати для нього значення або визначити DEFAULT.
Наприклад, для такого стовпця:
full_name text NOT NULLцей запит буде помилковим:
INSERT INTO app_users (email)
VALUES ('user@example.com');Якщо таблиця вже існує, команда CREATE TABLE завершиться помилкою. Перед повторним створенням у навчальному середовищі можна використати:
DROP TABLE IF EXISTS app_users;У робочій базі даних обережно ставтеся до DROP TABLE, адже команда видаляє таблицю разом із її даними.
Тип стовпця повинен відповідати значенню. Наприклад, дату потрібно передавати у форматі, який PostgreSQL може розпізнати як дату:
'1995-04-12'А для boolean використовують true або false:
trueТаблицю створюють командою CREATE TABLE.
Кожен стовпець має назву та тип даних.
PRIMARY KEY однозначно ідентифікує рядок.
NOT NULL забороняє порожні значення.
UNIQUE забороняє дублікати.
DEFAULT задає значення, якщо його не передали.
CHECK перевіряє значення за умовою.
GENERATED ALWAYS AS IDENTITY автоматично генерує числові ідентифікатори.
Вдале проєктування таблиці починається з правильного вибору типів даних і обмежень.