2010-01-04 3 views
3

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

У меня есть страница 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, но documentation утверждает, что она устарела и будет удалена в ближайшее время. Я также видел использование CURRVAL('my_sequence_table.id'), но я не уверен, что это будет работать с AJAX, поскольку это может поднять состояние гонки.

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

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

+0

oh BTW, pg_last_oid, конечно же, не очень хорошая идея. По умолчанию таблицы не имеют идентификаторов OID. – alvherre

+0

@ alvherre - Да, я поймал это где-то в своем чтении. Что означает O OID в любом случае? –

+1

"объект". Обратите внимание, что OID по-прежнему используются для идентификации системных объектов (т. Е. Таблиц, схем, баз данных и т. Д.). – alvherre

ответ

2

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

+0

Спасибо за ссылку. После некоторого большего чтения, я думаю, что буду использовать опцию «RETURNING id». –

5

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

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

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

+0

Спасибо за ваш ввод на 'RETURNING' verses' currval() '.Приятно видеть, что следят другие. –

0

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

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

Смежные вопросы