Пошук уроків, статей та іншого контенту
Створіть таблицю, задайте її стовпці та визначте структуру реляційної моделі за допомогою CREATE TABLE.
У реляційній базі даних таблиця зберігає однотипні записи:
стовпці описують властивості запису;
рядки містять конкретні записи;
типи даних визначають, які значення можна зберігати у стовпці;
обмеження визначають правила для цих значень.
Наприклад, таблиця products може описувати товари. Один рядок відповідатиме одному товару, а стовпці міститимуть його ідентифікатор, назву, ціну та дату створення.
Для створення таблиці в PostgreSQL використовується команда CREATE TABLE.
CREATE TABLE назва_таблиці (
назва_стовпця тип_даних,
назва_стовпця тип_даних
);Наприклад:
CREATE TABLE products (
name text,
price numeric
);Ця команда створює таблицю products із двома стовпцями:
name має тип text;
price має тип numeric.
Після створення таблиця ще не містить жодного рядка. Команда CREATE TABLE визначає лише її структуру.
Для кожного стовпця потрібно вказати назву й тип даних.
Поширені типи PostgreSQL:
integer — цілі числа;
bigint — великі цілі числа;
numeric — точні числові значення, зручно для грошей;
text — текст довільної довжини;
varchar(n) — текст із максимальною довжиною n;
boolean — логічне значення true або false;
date — дата без часу;
timestamp — дата й час.
Наприклад:
CREATE TABLE users (
id integer,
username text,
age integer,
is_active boolean,
birth_date date,
registered_at timestamp
);Назви стовпців зазвичай пишуть у нижньому регістрі, використовуючи змістовні імена. Для назв із кількох слів часто застосовують snake_case: created_at, first_name, phone_number.
Первинний ключ — це стовпець або набір стовпців, які однозначно ідентифікують кожен рядок таблиці.
Для ідентифікатора часто використовують цілочисловий стовпець із автоматичною генерацією значень:
CREATE TABLE users (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
username text NOT NULL
);Тут:
id має цілий тип;
PostgreSQL автоматично генерує для нього значення;
PRIMARY KEY робить id первинним ключем;
первинний ключ не може містити NULL;
значення первинного ключа мають бути унікальними.
GENERATED ALWAYS AS IDENTITY — сучасний спосіб автоматично генерувати послідовні ідентифікатори в PostgreSQL.
Обмеження визначають правила, яким повинні відповідати дані.
NOT NULLЗабороняє залишати стовпець без значення:
CREATE TABLE categories (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL
);У цій таблиці кожна категорія повинна мати назву.
Без NOT NULL PostgreSQL дозволяє зберегти спеціальне значення NULL, яке означає відсутність значення.
UNIQUEВимагає, щоб значення стовпця не повторювалися:
CREATE TABLE accounts (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email text NOT NULL UNIQUE
);Два облікові записи не можуть мати однакову адресу електронної пошти.
DEFAULTВстановлює значення за замовчуванням, якщо під час додавання рядка значення не вказали:
CREATE TABLE tasks (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title text NOT NULL,
is_completed boolean NOT NULL DEFAULT false
);Якщо для is_completed не вказати значення, PostgreSQL автоматично використає false.
CHECKПеревіряє, що значення відповідає заданій умові:
CREATE TABLE products (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
price numeric(10, 2) NOT NULL CHECK (price >= 0)
);Ціна не може бути від’ємною.
Нижче наведено приклад створення таблиці товарів:
DROP TABLE IF EXISTS products;
CREATE TABLE products (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
description text,
price numeric(10, 2) NOT NULL CHECK (price >= 0),
in_stock boolean NOT NULL DEFAULT true,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);Розглянемо структуру таблиці:
id — унікальний ідентифікатор товару;
name — обов’язкова назва товару;
description — необов’язковий опис;
price — ціна з двома цифрами після десяткового роздільника;
in_stock — ознака наявності товару, за замовчуванням true;
created_at — дата й час створення, за замовчуванням поточний момент.
numeric(10, 2) означає:
загалом можна зберігати до 10 цифр;
2 цифри призначені для дробової частини.
Наприклад, значення 1999.99 відповідає цьому типу.
Команда DROP TABLE IF EXISTS products у прикладі видаляє таблицю, якщо вона вже існує. Це зручно для повторного запуску прикладу в навчальній базі. У реальному проєкті перед видаленням таблиці потрібно переконатися, що її дані більше не потрібні.
Якщо команда має виконуватися без помилки навіть за наявності таблиці, можна використати IF NOT EXISTS:
CREATE TABLE IF NOT EXISTS products (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
price numeric(10, 2) NOT NULL CHECK (price >= 0)
);Якщо таблиця products уже існує, PostgreSQL не створюватиме її повторно.
Важливо: IF NOT EXISTS не змінює структуру вже наявної таблиці. Якщо таблиця існує, але має інші стовпці або обмеження, ця команда не виправить її структуру.
Після створення таблиці можна перевірити її стовпці та обмеження в клієнті PostgreSQL, наприклад у psql:
\d productsТакож структуру можна переглянути через системний каталог PostgreSQL:
SELECT
column_name,
data_type,
is_nullable
FROM information_schema.columns
WHERE table_name = 'products'
ORDER BY ordinal_position;Запит покаже назви стовпців, їхні типи та інформацію про можливість зберігати NULL.
Під час виконання CREATE TABLE PostgreSQL:
перевіряє синтаксис команди;
створює таблицю із вказаною назвою;
додає визначені стовпці;
встановлює типи даних;
додає обмеження та значення за замовчуванням;
зберігає опис таблиці в системному каталозі.
Якщо назва таблиці вже використовується, звичайна команда CREATE TABLE завершиться помилкою. Для перевірки існування таблиці застосовують IF NOT EXISTS.
Між описами стовпців потрібні коми:
CREATE TABLE products (
id integer,
name text,
price numeric
);Кома не ставиться після останнього стовпця перед ).
Команду SQL зазвичай завершують крапкою з комою:
CREATE TABLE products (
id integer,
name text
);NULLNULL — це не порожній рядок і не число 0. Якщо поле може бути відсутнім, це потрібно врахувати під час проєктування таблиці. Якщо значення є обов’язковим, використовуйте NOT NULL.
Для цін не варто використовувати тип із плаваючою комою, якщо потрібні точні значення. У PostgreSQL для цього зазвичай використовують numeric, наприклад numeric(10, 2).
Повторний запуск такої команди спричинить помилку, якщо таблиця вже існує:
CREATE TABLE products (
id integer
);Для навчальних прикладів можна використовувати DROP TABLE IF EXISTS або CREATE TABLE IF NOT EXISTS, розуміючи різницю між ними.
CREATE TABLE створює таблицю та визначає її структуру.
Кожен стовпець має назву й тип даних.
PRIMARY KEY однозначно ідентифікує рядки.
NOT NULL робить значення обов’язковим.
UNIQUE забороняє дублікати.
DEFAULT задає значення за замовчуванням.
CHECK обмежує допустимі значення.
GENERATED ALWAYS AS IDENTITY дає змогу автоматично генерувати ідентифікатори.
IF NOT EXISTS запобігає помилці, якщо таблиця вже існує.