Пошук уроків, статей та іншого контенту
Налаштуйте автоматичні значення для стовпців, коли під час вставки їх не передано.
Значення за замовчуванням (DEFAULT) — це значення, яке PostgreSQL автоматично встановлює для стовпця, якщо під час вставки нового рядка цей стовпець не вказали.
Наприклад, для таблиці користувачів можна автоматично встановлювати:
дату створення;
початковий статус;
кількість балів;
логічне значення false.
CREATE TABLE users (
id integer,
username text NOT NULL,
status text DEFAULT 'active',
points integer DEFAULT 0,
created_at timestamp DEFAULT CURRENT_TIMESTAMP
);У цьому прикладі:
status автоматично отримує значення 'active';
points автоматично отримує значення 0;
created_at отримує поточні дату й час.
Якщо стовпець не вказати в INSERT, PostgreSQL використає його значення за замовчуванням.
CREATE TABLE users (
id integer,
username text NOT NULL,
status text DEFAULT 'active',
points integer DEFAULT 0,
created_at timestamp DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (id, username)
VALUES (1, 'olena');
SELECT *
FROM users;Результат матиме приблизно такий вигляд:
id | username | status | points | created_at
----+----------+--------+--------+---------------------
1 | olena | active | 0 | 2026-09-01 12:30:00Точне значення created_at залежить від поточного часу.
Значення DEFAULT можна вказати безпосередньо в INSERT:
INSERT INTO users (id, username, status, points)
VALUES (2, 'andrii', DEFAULT, DEFAULT);У цьому випадку:
status отримає 'active';
points отримає 0;
created_at також отримає значення за замовчуванням, оскільки його не вказано.
Також можна використати DEFAULT для всіх стовпців:
INSERT INTO users
VALUES (3, 'marta', DEFAULT, DEFAULT, DEFAULT);Однак безпечніше явно перелічувати назви стовпців у INSERT. Тоді зміна структури таблиці менше впливатиме на запити.
Значення за замовчуванням використовується лише тоді, коли стовпець:
не вказано в INSERT;
має явне значення DEFAULT.
Якщо передати NULL, PostgreSQL збереже саме NULL, а не значення за замовчуванням.
CREATE TABLE tasks (
id integer,
title text NOT NULL,
completed boolean DEFAULT false
);
INSERT INTO tasks (id, title)
VALUES (1, 'Вивчити DEFAULT');
INSERT INTO tasks (id, title, completed)
VALUES (2, 'Перевірити NULL', NULL);
SELECT *
FROM tasks;Результат:
id | title | completed
----+--------------------+-----------
1 | Вивчити DEFAULT | false
2 | Перевірити NULL |У другому рядку completed має значення NULL, тому що його було передано явно.
Якщо потрібно заборонити NULL, додайте обмеження NOT NULL:
CREATE TABLE tasks (
id integer,
title text NOT NULL,
completed boolean NOT NULL DEFAULT false
);Тепер спроба передати NULL завершиться помилкою:
INSERT INTO tasks (id, title, completed)
VALUES (1, 'Завдання', NULL);Значенням за замовчуванням може бути:
число;
рядок;
логічне значення;
дата або час;
вираз, який PostgreSQL обчислює під час вставки.
CREATE TABLE orders (
id integer,
product_name text NOT NULL,
quantity integer DEFAULT 1,
is_paid boolean DEFAULT false,
created_at timestamp DEFAULT CURRENT_TIMESTAMP
);Під час кожної вставки created_at отримує поточні дату й час:
INSERT INTO orders (id, product_name)
VALUES (1, 'Keyboard');
INSERT INTO orders (id, product_name, quantity)
VALUES (2, 'Mouse', 2);
SELECT *
FROM orders;Важливо: CURRENT_TIMESTAMP обчислюється під час вставки рядка. Це не одне заздалегідь зафіксоване значення для всієї таблиці.
Для вже створеної таблиці значення за замовчуванням можна додати командою ALTER TABLE.
CREATE TABLE products (
id integer,
name text NOT NULL,
stock integer
);
ALTER TABLE products
ALTER COLUMN stock SET DEFAULT 0;Після цього нові рядки без stock отримуватимуть 0:
INSERT INTO products (id, name)
VALUES (1, 'Notebook');
SELECT *
FROM products;Результат:
id | name | stock
----+----------+-------
1 | Notebook | 0Команда SET DEFAULT не змінює вже наявні рядки. Вона застосовується лише до наступних вставок.
Щоб прибрати значення за замовчуванням, використайте DROP DEFAULT:
ALTER TABLE products
ALTER COLUMN stock DROP DEFAULT;Після цього PostgreSQL більше не підставлятиме 0 для нових рядків, якщо stock не вказано. Якщо стовпець не має NOT NULL, у ньому буде NULL.
INSERT INTO products (id, name)
VALUES (2, 'Pen');
SELECT *
FROM products;Результат для нового рядка:
id | name | stock
----+------+-------
2 | Pen |У графічному клієнті або в системному каталозі PostgreSQL можна переглядати налаштування таблиці. У командному рядку psql зручно використати:
\d usersУ структурі таблиці буде показано значення за замовчуванням для відповідних стовпців, наприклад:
status | text | default 'active'::text
points | integer | default 0
created_at | timestamp | default CURRENT_TIMESTAMPDROP TABLE IF EXISTS registrations;
CREATE TABLE registrations (
id integer NOT NULL,
email text NOT NULL,
status text NOT NULL DEFAULT 'pending',
attempts integer NOT NULL DEFAULT 0,
registered_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO registrations (id, email)
VALUES (1, 'olena@example.com');
INSERT INTO registrations (id, email, status, attempts)
VALUES (2, 'andrii@example.com', DEFAULT, DEFAULT);
INSERT INTO registrations (id, email, status, attempts)
VALUES (3, 'marta@example.com', 'confirmed', 1);
SELECT
id,
email,
status,
attempts,
registered_at
FROM registrations
ORDER BY id;Для першого рядка PostgreSQL автоматично встановить:
status — 'pending';
attempts — 0;
registered_at — поточні дату й час.
Для другого рядка використано DEFAULT явно, тому результат буде таким самим для цих стовпців.
INSERT INTO tasks (id, title, completed)
VALUES (1, 'Завдання', NULL);DEFAULT не буде використано. Якщо потрібно автоматичне значення, не передавайте стовпець або використовуйте DEFAULT.
Додавання значення за замовчуванням не заповнює автоматично вже наявні рядки:
ALTER TABLE products
ALTER COLUMN stock SET DEFAULT 0;Ця команда впливає лише на майбутні вставки. Старі рядки потрібно змінювати окремим UPDATE, якщо це необхідно.
DEFAULT 0 не забороняє вставити NULL:
CREATE TABLE counters (
value integer DEFAULT 0
);Такий запит дозволений:
INSERT INTO counters (value)
VALUES (NULL);Якщо NULL неприпустимий, використовуйте:
CREATE TABLE counters (
value integer NOT NULL DEFAULT 0
);Рядкові значення в PostgreSQL потрібно записувати в одинарних лапках:
status text DEFAULT 'pending'Подвійні лапки використовуються для ідентифікаторів, наприклад назв стовпців або таблиць, а не для звичайних рядків.
DEFAULT задає автоматичне значення для стовпця.
Значення за замовчуванням використовується, якщо стовпець пропущено або вказано DEFAULT.
Явний NULL не замінюється значенням за замовчуванням.
Для поточної дати й часу можна використовувати CURRENT_TIMESTAMP.
NOT NULL DEFAULT ... одночасно задає автоматичне значення та забороняє NULL.
ALTER COLUMN ... SET DEFAULT додає значення за замовчуванням до наявного стовпця.
ALTER COLUMN ... DROP DEFAULT видаляє його.
Додавання DEFAULT не змінює вже наявні рядки.