Получение идентификатора внутри блока транзакций PostgreSQL
Я пытаюсь обернуть все мои транзакции, которые должны быть все или ничего в BEGIN
и COMMIT
, но я не уверен, как это сделать в следующих случаях.
у меня есть 3 таблицы, одна для изображений, одна для albums
, и для отношений между ними, а именно album_images
. Система работает так, что пользователь может создать альбом и заполнить его своими изображениями за одну операцию. SQL выглядит следующим образом:
BEGIN;
INSERT INTO albums [...]; -- Create a new album row
SELECT id AS album_id FROM albums WHERE [...]; -- Get that rows ID
-- Now use album_id in the next statement
INSERT INTO album_images (album_id, image_id) [...];
COMMIT;
это, вероятно, общая проблема, я просто не конечно, что искать,и я не могу найти решение в документации.
3 ответов
в качестве альтернативы вставке ... Возвращая предложение, упомянутое Коди, вы можете использовать текущее значение последовательности, связанной с столбцом ID:
BEGIN;
INSERT INTO albums [...];
INSERT INTO album_images (currval('albums_id_seq'), image_id) [...];
COMMIT;
это предполагает стандартную схему именования из Postgres при создании последовательности автоматически для столбцов, определенных как serial
.
Другой альтернативой-если вы используете только одну вставку-является использование . Тогда вам даже не нужно будет вводить имя последовательности во вставку заявление:
BEGIN;
INSERT INTO albums [...];
INSERT INTO album_images (lastval(), image_id) [...];
COMMIT;
Postgres предоставляет предложение "RETURNING", используемое во вставке, чтобы легко вернуть вновь созданный первичный ключ.
http://www.postgresql.org/docs/8.3/interactive/sql-insert.html
примеры: http://6c62.net/blog/?p=48
вы можете получить идентификатор вставленной строки, как
INSERT INTO albums [...] returning album_id;
это вернет album_id после вставки.