Получение идентификатора внутри блока транзакции PostgreSQL - PullRequest
7 голосов
/ 26 июля 2011

Я пытаюсь заключить все свои транзакции, которые должны быть "все или ничего", в 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 ]

6 голосов
/ 26 июля 2011

В качестве альтернативы предложенному Коди предложению INSERT ... RETURNING можно использовать текущее значение последовательности, связанной со столбцом идентификатора:

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (currval('albums_id_seq'), image_id) [...];
COMMIT;

Это предполагает стандартную схему именования от Postgres, когдасоздавая последовательность автоматически для столбцов, определенных как serial.

Другая альтернатива - если вы используете только одну вставку - это использовать функцию lastval().Тогда вам даже не нужно вводить имя последовательности в оператор INSERT:

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (lastval(), image_id) [...];
COMMIT;
2 голосов
/ 26 июля 2011

Postgres предоставляет предложение «RETURNING», используемое в INSERT для быстрого возврата вновь созданного первичного ключа.

http://www.postgresql.org/docs/8.3/interactive/sql-insert.html

Некоторые примеры: http://6c62.net/blog/?p=48

0 голосов
/ 28 ноября 2015

Вы можете получить идентификатор вставленной строки как

INSERT INTO albums [...] returning album_id;

. После вставки будет возвращен идентификатор album_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...