Получение идентификатора внутри блока транзакций 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 после вставки.