Мне интересно, эффективен ли способ, которым я использую идентификатор последней строки, вставленной в таблицу postgresql.
Это работает, очевидно, но ссылка на последовательную последовательность. Значение currval может быть проблематичным, когда у меня есть много пользователей, добавляющих строки в одну и ту же таблицу одновременно.
Мой фактический путь:
$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect'); $insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')"); $last_id_query = pg_query("SELECT currval('customer_id_seq')"); $last_id_results = pg_fetch_assoc($last_id_query); print_r($last_id_results); pg_close($pgConnection);
Ну, это просто тест атм. Но так или иначе, я вижу 3 проблемы таким образом:
Любое предложение / лучшие способы?
ps: я не могу использовать PDO, потому что, похоже, немного отстает от точки сохранения транзакций; Я не буду использовать zend, и, в конце концов, я предпочту использовать функции php pg_ * (возможно, в конце концов создам свои классы)
РЕДАКТИРОВАТЬ:
@SpliFF (он удалил свой ответ): это будет работать лучше?
$pgConnection = pg_connect('host=127.0.0.1 dbname=test user=myuser password=xxxxx')or die('cant connect'); pg_query("BEGIN"); $insert = pg_query("INSERT INTO customer (name) VALUES ('blabla')"); $last_id_query = pg_query("SELECT currval('customer_id_seq')"); $last_id_results = pg_fetch_assoc($last_id_query); print_r($last_id_results); //do somethings with the new customer id pg_query("COMMIT"); pg_close($pgConnection);
Если вы используете более новую версию PostgreSQL (> 8.1), вы должны использовать предложение RETURNING команды INSERT (и UPDATE).
OTOH, если вы настаиваете на использовании одной из функций манипуляции последовательностями, пожалуйста, прочитайте точное руководство . Указатель: «Обратите внимание, что поскольку это возвращает локальное значение сеанса, оно дает предсказуемый ответ о том, выполнялись ли другие сеансы nextval с текущего сеанса».
Вставьте и проверьте curval (seq) внутри одной транзакции. Перед совершением транзакции вы увидите curval (seq) для вашего запроса и вне зависимости от того, кто еще вставил в одно и то же время.
Не помните синтаксис точно – читайте в ручном режиме (последний использованный pgsql около 3 лет назад), но в целом это выглядит так:
BEGIN TRANSACTION; INSERT ...; SELECT curval(seq); COMMIT;
ех. minsert в log (desc, user_id) значения («бросить вызов», 6) вернуть идентификатор