Postgres / PHP - Каков стандартный способ получения идентификатора вставленной строки? - PullRequest
3 голосов
/ 04 января 2010

Я искал в Google и прочитал несколько статей о том, как разные люди подходят к этой проблеме, но мне было интересно, каков стандартный способ ее решения, а также, который лучше всего подойдет для моей ситуации.

У меня есть страница AJAX, которая создает новый вопрос, и мне нужно знать, как извлечь идентификатор из запроса на вставку в том же файле php на следующей строке.

Это выглядит примерно так:

$r = pg_query("INSERT INTO questions (audit_id, type_id, order) VALUES (1,1,1)");
// Fetch ID from $r here...

Я видел функцию mysql_insert_id() для MySQL и слышал, что pg_last_oid() похож на PostgreSQL, но документация 1015 * утверждает, что она устарела и будет удалена в ближайшее время. Я также видел использование CURRVAL('my_sequence_table.id'), но я не уверен, сработает ли это с AJAX, так как это может вызвать состояние гонки.

Может кто-нибудь сказать, пожалуйста, стандарт PHP / PostgreSQL способ решения этой проблемы? Буду очень признателен за любые комментарии.

P.S. Я скучаю по Ruby on Rails!

Ответы [ 3 ]

5 голосов
/ 04 января 2010

Вероятно, вам лучше всего использовать INSERT INTO questions ... VALUES (1,1,1) RETURNING audit_id, поскольку это даст вам правильное значение, независимо от того, вставляете ли вы значение вручную или через последовательность.

Обратите внимание, что уловка currval(), безусловно, должна работать, если вы получаете тот же сеанс - currval() гарантированно вернет то же значение, что и последовательность, доставленная в ваш сеанс, независимо от того, что делают другие параллельные сеансы. Это может вызвать проблему только в том случае, если у вас есть пул соединений, который каким-то образом использует соединение для первого запроса, отличного от второго запроса, но если он это сделает, он будет довольно поврежден. Я не знаю ни одного пулера, который бы так поступал.

Обновление : См. Функцию pg_get_serial_sequence (), которая берет имя таблицы и столбца и возвращает имя связанной последовательности. Это более практично, чем жесткое кодирование имени последовательности в вашем коде.

2 голосов
/ 04 января 2010

MySQL имеет понятие полей автоинкремента, PostgreSQL имеет понятие последовательностей . Последовательность Postgres - это именованный объект базы данных, значение которого может быть увеличено. Пожалуйста, посмотрите это FAQ .

0 голосов
/ 04 января 2010

Я бы рекомендовал использовать опцию CURRVAL('my_sequence_table.id').

Это не должно вызывать условия гонки для вас, так как он вернет самое последнее значение для текущего сеанса , и это будут два последовательных оператора в одном сеансе.

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