Сегодня мы добавим ещё одну магическую деталь к нашим знаниям: команду RETURNING. Это мощный инструмент, который позволяет сразу получать нужные данные обратно после вставки, обновления или удаления. А теперь представьте, что вы вставляете строку в таблицу и тут же получаете её уникальный идентификатор. Удобно? Конечно! Давайте учиться!
После выполнения операций INSERT, UPDATE или DELETE порой возникает необходимость сразу получить данные, которые были затронуты. Например, после вставки новой строки в таблицу нам нужно знать её автоматически созданный первичный ключ (уникальный идентификатор). Вместо того чтобы отправлять отдельный запрос на получение этих данных, мы можем сделать это сразу при выполнении операции с помощью RETURNING.
Допустим, вы добавляете нового студента в таблицу students. У каждого студента есть уникальный идентификатор (скажем, student_id), который генерируется автоматически. После добавления новой записи вы хотите тут же использовать этот идентификатор для записей студента на курс. Без RETURNING вам пришлось бы сначала добавить студента, потом сделать отдельный запрос SELECT, чтобы найти его идентификатор. С RETURNING всё делается одним запросом!
Синтаксис команды RETURNING
Команда RETURNING добавляется в конец операций INSERT, UPDATE и DELETE. Вот общий синтаксис:
-- INSERT синтаксис:
INSERT INTO таблица (column1, column2, ...)
VALUES (value1, value2, ...)
RETURNING колонка;
-- UPDATE синтаксис:
UPDATE таблица
SET column1 = value1
WHERE условие
RETURNING колонка;
-- DELETE синтаксис:
DELETE FROM таблица
WHERE условие
RETURNING колонка;
RETURNING позволяет указать, какие столбцы из изменённых строк хотите вернуть. Это может быть один конкретный столбец (например, первичный ключ) или сразу несколько столбцов.
Использование RETURNING с INSERT
Рассмотрим пример таблицы students:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE
);
Добавим нового студента и сразу получим его идентификатор:
INSERT INTO students (first_name, last_name, email)
VALUES ('Otto', 'Lin', 'otto.lin@example.com')
RETURNING student_id;
Запрос вернёт идентификатор добавленного студента:
| student_id |
|---|
| 1 |
Вы только что добавили студента Otto Lin, и PostgreSQL тут же сообщил вам его student_id. Удобно? А как же!
А теперь давайте вставим и сразу же получим несколько столбцов. Если нам нужны не только student_id, но и другие данные, например, имя и фамилия студента, мы можем запросить их через RETURNING:
INSERT INTO students (first_name, last_name, email)
VALUES ('Alex', 'Ming', 'alex.ming@example.com')
RETURNING student_id, first_name, last_name;
Результат:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Alex | Ming |
Использование RETURNING с UPDATE
Иногда после обновления данных нам нужно узнать, какие именно строки были изменены. RETURNING прекрасно справляется с этой задачей.
Представьте, что студент Otto Lin решил сменить свой email. Обновим его данные и сразу получим информацию об изменённой строке:
UPDATE students
SET email = 'lin.new@example.com'
WHERE student_id = 1
RETURNING student_id, email;
Результат:
| student_id | |
|---|---|
| 1 | lin.new@example.com |
Теперь вы точно знаете, что email студента с student_id = 1 был успешно обновлён.
Использование RETURNING с DELETE
Когда вы удаляете записи из таблицы, бывает полезно знать, какие строки были удалены. С RETURNING вы можете получить данные удалённых строк.
Приведём пример. Предположим, что студент Peter Ming был отчислен. Удалим его из таблицы и получим информацию о его удалении:
DELETE FROM students
WHERE student_id = 2
RETURNING student_id, first_name, last_name;
Результат:
| student_id | first_name | last_name |
|---|---|---|
| 2 | Peter | Ming |
Теперь вы уверены, что именно Peter Ming был удалён.
Практические советы
Использовать RETURNING всегда, когда вам нужны данные затронутых строк. Это позволяет избежать лишних запросов к базе данных.
Минимизируйте количество возвращаемых данных. Если вам нужен только первичный ключ, запрашивайте только его.
В комбинации с транзакциями RETURNING становится особенно мощным. Например, вы можете добавлять данные в несколько связанных таблиц, передавая идентификаторы с помощью RETURNING.
Типичные ошибки при использовании RETURNING
Часто новички сталкиваются с тем, что забывают, что RETURNING работает только с изменёнными строками. Например, если запрос UPDATE или DELETE не нашёл ни одной строки, RETURNING вернёт пустой результат. Не пугайтесь, это нормально. Просто убедитесь, что ваш запрос корректен, или обработайте этот случай в коде приложения.
И ещё одна распространённая ошибка: попытка использовать RETURNING для несуществующих столбцов. Обязательно убедитесь, что все запрашиваемые столбцы существуют в вашей таблице.
Теперь вы знаете, как с помощью RETURNING можно значительно упростить работу с данными. Это один из тех инструментов, которые вы обязательно оцените при создании реальных приложений. Вперёд к новым горизонтам!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ