pg_last_oid
(PHP 4 >= 4.2.0, PHP 5)
pg_last_oid — Возвращает OID последней добавленной в базу строки
Описание
$result
)pg_last_oid() используется для определения OID, соответствующего вставленной в таблицу строке.
Поле OID таблиц баз данных стало необязательным, начиная с версии PostgreSQL 7.2, а с версии 8.1 перестанет добавляться в таблицы по-умолчанию. Если поле OID таблицы не задано, используйте функцию pg_result_status() для проверки успешности вставки записей в таблицу.
Чтобы получить значение SERIAL поля после вставки строки в таблицу, используйте функцию PostgreSQL CURRVAL, передав ей имя последовательности, значение которой нужно получить. Чтобы узнать имя последовательности, необходимо использовать функцию pg_get_serial_sequence (PostgreSQL 8.0).
В PostgreSQL 8.1 есть функция LASTVAL, возвращающая значение наиболее часто используемой за сессию последовательности. Так можно избежать необходимость задавать название последовательности, таблицы или колонки.
Замечание:
Прежнее название функции: pg_getlastoid().
Список параметров
-
result
-
Ресурс результата запроса PostgreSQL, возвращаемый функциями pg_query(), pg_query_params() или pg_execute() (в числе прочих).
Возвращаемые значения
Строка, содержащая OID последней вставленной строки на соединении
connection
, либо FALSE
, если произошла ошибка или
поле OID недоступно.
Примеры
Пример #1 Пример использования pg_last_oid()
<?php
$pgsql_conn = pg_connect("dbname=mark host=localhost");
$res1 = pg_query("CREATE TABLE test (a INTEGER) WITH OIDS");
$res2 = pg_query("INSERT INTO test VALUES (1)");
$oid = pg_last_oid($res2);
?>
Смотрите также
- pg_query() - Выполняет запрос
- pg_result_status() - Возвращает состояние результата запроса
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- PostgreSQL
- pg_affected_rows
- pg_cancel_query
- pg_client_encoding
- pg_close
- pg_connect_poll
- pg_connect
- pg_connection_busy
- pg_connection_reset
- pg_connection_status
- pg_consume_input
- pg_convert
- pg_copy_from
- pg_copy_to
- pg_dbname
- pg_delete
- pg_end_copy
- pg_escape_bytea
- pg_escape_identifier
- pg_escape_literal
- pg_escape_string
- pg_execute
- pg_fetch_all_columns
- pg_fetch_all
- pg_fetch_array
- pg_fetch_assoc
- pg_fetch_object
- pg_fetch_result
- pg_fetch_row
- pg_field_is_null
- pg_field_name
- pg_field_num
- pg_field_prtlen
- pg_field_size
- pg_field_table
- pg_field_type_oid
- pg_field_type
- pg_flush
- pg_free_result
- pg_get_notify
- pg_get_pid
- pg_get_result
- pg_host
- pg_insert
- pg_last_error
- pg_last_notice
- pg_last_oid
- pg_lo_close
- pg_lo_create
- pg_lo_export
- pg_lo_import
- pg_lo_open
- pg_lo_read_all
- pg_lo_read
- pg_lo_seek
- pg_lo_tell
- pg_lo_truncate
- pg_lo_unlink
- pg_lo_write
- pg_meta_data
- pg_num_fields
- pg_num_rows
- pg_options
- pg_parameter_status
- pg_pconnect
- pg_ping
- pg_port
- pg_prepare
- pg_put_line
- pg_query_params
- pg_query
- pg_result_error_field
- pg_result_error
- pg_result_seek
- pg_result_status
- pg_select
- pg_send_execute
- pg_send_prepare
- pg_send_query_params
- pg_send_query
- pg_set_client_encoding
- pg_set_error_verbosity
- pg_socket
- pg_trace
- pg_transaction_status
- pg_tty
- pg_unescape_bytea
- pg_untrace
- pg_update
- pg_version
Коментарии
You could use this to get the last insert id...
CREATE TABLE test (
id serial,
something int not null
);
This creates the sequence test_id_seq. Now do the following after inserting something into table test:
INSERT INTO test (something) VALUES (123);
SELECT currval('test_id_seq') AS lastinsertid;
lastinsertid should contain your last insert id.
This is very useful function :)
function sql_last_inserted_id($connection, $result, $table_name, $column_name) {
$oid = pg_last_oid ( $result);
$query_for_id = "SELECT $column_name FROM $table_name WHERE oid=$oid";
$result_for_id = pg_query($connection,$query_for_id);
if(pg_num_rows($result_for_id))
$id=pg_fetch_array($result_for_id,0,PGSQL_ASSOC);
return $id[$column_name];
}
Call after insert, simply ;)
As pointed out on a busy site some of the above methods might actually give you an incorrect answer as another record is inserted inbetween your insert and the select. To combat this put it into a transaction and dont commit till you have done all the work
The way I nuderstand it, each value is emitted by a sequence only ONCE. If you retrieve a number (say 12) from a sequence using nextval(), the sequence will advance and subsequent calls to nextval() will return further numbers (after 12) in the sequence.
This means that if you use nextval() to retrieve a value to use as a primary key, you can be guaranteed that no other calls to nextval() on that sequence will return the same value. No race conditions, no transactions required.
That's what sequences are *for* afaik :^)
I'm sharing an elegant solution I found on the web (Vadim Passynkov):
CREATE RULE get_pkey_on_insert AS ON INSERT TO Customers DO SELECT currval('customers_customers_id_seq') AS id;
Every time you insert to the Customers table, postgreSQL will return a table with the id you just inserted. No need to worry about concurrency, the ressource is locked when the rule gets executed.
Note that in cases of multiple inserts:
INSERT INTO C1 ( ... ) ( SELECT * FROM C2);
we would return the id of the last inserted row.
For more info about PostgreSQL rules:
http://www.postgresql.org/docs/7.4/interactive/sql-createrule.html
Simply getting LAST_INSERT_ID;
<?php
// Note: waiting for "select" part from pg_query below.
// Note: separating the query parts using semicolons (;).
$qry = pg_query("
INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19);
SELECT Currval('users_id_seq') LIMIT 1
");
// or
$qry = pg_query("
INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19) RETURNING Currval('users_id_seq')");
$fch = pg_fetch_row($qry);
print_r($fch);
?>
Array
(
[0] => 3 -> Gotcha!
)