Пошук уроків, статей та іншого контенту
Додайте один або багато рядків до таблиці та передайте значення для вибраних стовпців.
INSERTКоманда INSERT додає нові рядки до таблиці:
INSERT INTO назва_таблиці (стовпець_1, стовпець_2)
VALUES (значення_1, значення_2);Назви стовпців у дужках визначають, у які поля потрібно записати значення. Значення у VALUES мають бути в такому самому порядку.
Наприклад:
INSERT INTO users (name, email)
VALUES ('Олена', 'olena@example.com');Ця команда додає одного користувача. Якщо в таблиці є інші стовпці зі значеннями за замовчуванням, PostgreSQL заповнить їх автоматично.
Розглянемо таблицю користувачів:
CREATE TABLE users (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
email text NOT NULL UNIQUE,
age integer,
created_at timestamp DEFAULT current_timestamp
);У таблиці:
id генерується PostgreSQL автоматично;
name та email є обов’язковими;
age можна не вказувати;
created_at автоматично отримує поточний час.
Додамо користувача:
INSERT INTO users (name, email, age)
VALUES ('Олена', 'olena@example.com', 28);Стовпець id не вказано, тому PostgreSQL згенерує його самостійно. Стовпець created_at також не вказано, тому буде використано значення current_timestamp.
Перевірити доданий рядок можна командою:
SELECT *
FROM users;Не потрібно вказувати всі стовпці таблиці. Можна передати лише ті, для яких є значення:
INSERT INTO users (name, email)
VALUES ('Андрій', 'andrii@example.com');У цьому випадку:
id згенерується автоматично;
age матиме значення NULL, оскільки для нього не встановлено значення за замовчуванням;
created_at отримає поточний час.
Якщо стовпець має обмеження NOT NULL і не має значення за замовчуванням, його потрібно вказати:
INSERT INTO users (email)
VALUES ('new@example.com');Ця команда завершиться помилкою, тому що для name не передано значення, а цей стовпець має обмеження NOT NULL.
За один запит можна додати багато рядків. Для цього після VALUES вказують кілька наборів значень, розділених комами:
INSERT INTO users (name, email, age)
VALUES
('Марія', 'maria@example.com', 31),
('Петро', 'petro@example.com', 25),
('Наталія', 'nataliia@example.com', 29);Для кожного рядка кількість і порядок значень мають відповідати списку стовпців:
INSERT INTO users (name, email, age)
VALUES
('Іван', 'ivan@example.com', 35),
('Софія', 'sofia@example.com', 22);Такий запис зазвичай зручніший, ніж виконання окремої команди INSERT для кожного рядка.
Щоб явно використати значення за замовчуванням, застосовують ключове слово DEFAULT:
INSERT INTO users (name, email, age)
VALUES ('Дмитро', 'dmytro@example.com', DEFAULT);Для age у таблиці не задано значення за замовчуванням, тому в цьому прикладі буде записано NULL.
Якщо для стовпця задано значення за замовчуванням, DEFAULT використає саме його:
INSERT INTO users (name, email, created_at)
VALUES ('Леся', 'lesia@example.com', DEFAULT);Для created_at буде використано current_timestamp.
Можна додати рядок, не передаючи жодного явного значення для стовпців, якщо всі обов’язкові поля мають значення за замовчуванням:
INSERT INTO users
DEFAULT VALUES;У таблиці users ця команда не спрацює, оскільки стовпці name та email є обов’язковими й не мають значень за замовчуванням.
RETURNINGPostgreSQL дозволяє повернути додані дані одразу після INSERT за допомогою RETURNING:
INSERT INTO users (name, email, age)
VALUES ('Катерина', 'kateryna@example.com', 27)
RETURNING id, name, email, created_at;Результатом буде доданий рядок разом із автоматично створеними значеннями, зокрема id і created_at.
RETURNING також працює під час додавання кількох рядків:
INSERT INTO users (name, email)
VALUES
('Роман', 'roman@example.com'),
('Юлія', 'yuliia@example.com')
RETURNING id, name;Це корисно, коли після додавання потрібно отримати ідентифікатори нових записів.
Наведений скрипт можна виконати в PostgreSQL:
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
email text NOT NULL UNIQUE,
age integer,
created_at timestamp DEFAULT current_timestamp
);
-- Додавання одного користувача
INSERT INTO users (name, email, age)
VALUES ('Олена', 'olena@example.com', 28);
-- Додавання кількох користувачів
INSERT INTO users (name, email, age)
VALUES
('Андрій', 'andrii@example.com', 33),
('Марія', 'maria@example.com', 26);
-- Додавання користувача без необов'язкового віку
INSERT INTO users (name, email)
VALUES ('Петро', 'petro@example.com');
-- Перевірка доданих рядків
SELECT id, name, email, age, created_at
FROM users
ORDER BY id;Кількість значень має відповідати кількості стовпців:
INSERT INTO users (name, email)
VALUES ('Олена');У цьому прикладі вказано два стовпці, але передано лише одне значення.
Правильний варіант:
INSERT INTO users (name, email)
VALUES ('Олена', 'olena@example.com');Значення відповідають стовпцям за позицією:
INSERT INTO users (name, email)
VALUES ('olena@example.com', 'Олена');Тут електронну адресу буде записано в name, а ім’я — в email. PostgreSQL може відхилити такий запит через типи або обмеження, але порядок все одно потрібно перевіряти.
Якщо стовпець має NOT NULL і не має значення за замовчуванням, його не можна пропустити:
INSERT INTO users (email)
VALUES ('user@example.com');У таблиці users ця команда викличе помилку, оскільки name є обов’язковим.
Стовпець email має обмеження UNIQUE, тому одна й та сама адреса не може повторюватися:
INSERT INTO users (name, email)
VALUES ('Інший користувач', 'olena@example.com');Якщо така адреса вже є в таблиці, PostgreSQL поверне помилку порушення унікального обмеження.
Текстові значення потрібно записувати в одинарних лапках:
INSERT INTO users (name, email)
VALUES ('Олена', 'olena@example.com');Запис без лапок:
INSERT INTO users (name, email)
VALUES (Олена, olena@example.com);буде сприйнятий неправильно й призведе до синтаксичної помилки.
INSERT INTO додає рядки до таблиці.
Список стовпців визначає, куди записуються значення.
VALUES містить значення в тому самому порядку, що й список стовпців.
За один запит можна додати один або багато рядків.
Пропущені стовпці отримують значення за замовчуванням або NULL, якщо це дозволено.
DEFAULT явно використовує значення за замовчуванням.
RETURNING повертає додані рядки або їхні окремі стовпці.
Обмеження NOT NULL, UNIQUE та типи даних можуть відхилити некоректну вставку.