Альтернатива mysql_insert_id для postgresql

есть ли альтернатива функции PHP mysql_insert_id() для PostgreSQL? Большинство фреймворков частично решают проблему, находя текущее значение последовательности, используемой в идентификаторе. Однако бывают случаи, когда первичный ключ не является последовательным столбцом ....

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
23
0
18 325
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Посмотрите ВОЗВРАЩЕНИЕ необязательного предложения для инструкции INSERT. (Ссылка на официальную документацию PostgreSQL)

Но в основном вы делаете:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

а сам оператор INSERT возвращает идентификатор (или любое указанное вами выражение) затронутой строки.

С php.net:

$res=pg_query("SELECT nextval('foo_key_seq') as key");
$row=pg_fetch_array($res, 0);
$key=$row['key'];
// now we have the serial value in $key, let's do the insert
pg_query("INSERT INTO foo (key, foo) VALUES ($key, 'blah blah')");

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

Ответ принят как подходящий

С точки зрения PostgreSQL, в псевдокоде:

 * $insert_id = INSERT...RETURNING foo_id;-- only works for PostgreSQL >= 8.2. 

 * INSERT...; $insert_id = SELECT lastval(); -- works for PostgreSQL >= 8.1

 * $insert_id = SELECT nextval('foo_seq'); INSERT INTO table (foo...) values ($insert_id...) for older PostgreSQL (and newer PostgreSQL)

pg_last_oid() работает только там, где у вас есть OID. OID отключены по умолчанию, начиная с PostgreSQL 8.1.

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

Метод первый: ВСТАВИТЬ ... ВОЗВРАЩЕНИЕ

// yes, we're not using pg_insert()
$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_row($result);
$insert_id = $insert_row[0];

Метод второй: INSERT; lastval ()

$result = pg_execute($db, "INSERT INTO foo (bar) values (123);");
$insert_query = pg_query("SELECT lastval();");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];

Метод третий: nextval (); ВСТАВЛЯТЬ

$insert_query = pg_query($db, "SELECT nextval('foo_seq');");
$insert_row = pg_fetch_row($insert_query);
$insert_id = $insert_row[0];
$result = pg_execute($db, "INSERT INTO foo (foo_id, bar) VALUES ($insert_id, 123);");

Самым безопасным вариантом будет третий, но он громоздкий. Самый чистый - первый, но вам нужно будет запустить последнюю версию PostgreSQL. Однако большинство библиотек абстракции db еще не используют первый метод.

Отличный ответ, я перешел с третьего метода на первый из соображений скорости. Я использую python и psycopg2, и выполнение только одного оператора для массовой вставки данных - это просто более быстрый способ. Хотели бы знать, действительно ли третье безопаснее первого? Я бы подумал, что первый и третий одинаково безопасны, а у второго есть состояние гонки.

Ross 12.12.2012 08:25

Вы также можете использовать:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');

Вы должны указать в pg_fetch_result номер строки и имя поля, которое вы ищете, это более точный способ получить данные, которые вам нужны, но я не знаю, имеет ли это какое-то наказание в выполнение запроса. Помните, что этот метод предназначен для PostgreSQL версии 8.2 и выше.

да, это уже упоминалось в ответе @angch. Обратите внимание, что это не может использоваться для других sql-диалектов (sql-server, mysql и т. д.), Хотя

Jeffrey04 04.05.2011 07:18

Другие вопросы по теме