pg_last_oid

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_last_oid返回最后一行 的 OID

描述

pg_last_oid(PgSql\Result $result): string|int|false

pg_last_oid() 用于检索分配给插入行的 OID

从 PostgreSQL 7.2 开始,OID 字段成为可选字段,在 PostgreSQL 8.1 中默认情况下将不存在。当表中不存在 OID 字段时,程序员必须使用 pg_result_status() 来检查插入是否成功。

要获取插入行中 SERIAL 字段的值,必须使用 PostgreSQL CURRVAL 函数,并命名需要其最后值的序列。如果序列名称未知,则需要使用 PostgreSQL 8.0 函数 pg_get_serial_sequence

PostgreSQL 8.1 具有一个名为 LASTVAL 的函数,它返回会话中最近使用的序列的值。这样就避免了完全需要命名序列、表或列。

注意:

此函数以前称为 pg_getlastoid()

参数

result

一个 PgSql\Result 实例,由 pg_query()pg_query_params()pg_execute()(以及其他)返回。

返回值

一个 intstring,包含分配给指定 connection 中最近插入行的 OID,或在出错或没有可用的 OID 时返回 false

变更日志

版本 描述
8.1.0 result 参数现在期望一个 PgSql\Result 实例;以前,它期望的是一个 资源

示例

示例 #1 pg_last_oid() 示例

<?php
// 连接到数据库
pg_connect("dbname=mark host=localhost");

// 创建一个示例表
pg_query("CREATE TABLE test (a INTEGER) WITH OIDS");

// 向其中插入一些数据
$res = pg_query("INSERT INTO test VALUES (1)");

$oid = pg_last_oid($res);
?>

参见

添加备注

用户贡献的备注 6 个备注

julian at e2-media dot co dot nz
20 年前
据我了解,每个值仅由序列发出一次。如果您使用 nextval() 从序列中检索一个数字(例如 12),序列将前进,对 nextval() 的后续调用将返回序列中进一步的数字(12 之后)。

这意味着如果您使用 nextval() 检索一个值用作主键,您可以保证该序列上对 nextval() 的任何其他调用都不会返回相同的值。没有竞争条件,不需要事务。

据我所知,那就是序列的 *用途* :^)
a dot bardsley at lancs dot ac dot uk
21 年前
正如繁忙站点所指出的,上面提到的某些方法实际上可能会给出错误的答案,因为在您的插入和选择之间插入了另一条记录。为了解决这个问题,请将其放入事务中,并在完成所有操作之前不要提交。
dtutar at yore dot com dot tr
21 年前
这个函数非常有用 :)

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];
}

在插入后简单调用;)
webmaster at gamecrash dot net
21 年前
您可以使用它来获取最后一个插入的 ID...

CREATE TABLE test (
id serial,
something int not null
);

这将创建序列 test_id_seq。现在在将某些内容插入表 test 后执行以下操作:

INSERT INTO test (something) VALUES (123);
SELECT currval('test_id_seq') AS lastinsertid;

lastinsertid 应包含最后一个插入的 ID。
Jonathan Bond-Caron
19 年前
我在网上分享了一个优雅的解决方案(Vadim Passynkov)

CREATE RULE get_pkey_on_insert AS ON INSERT TO Customers DO SELECT currval('customers_customers_id_seq') AS id;

每次您插入 Customers 表时,PostgreSQL 都会返回一个包含您刚刚插入的 ID 的表。无需担心并发性,该资源在规则执行时会被锁定。

请注意,在多次插入的情况下
INSERT INTO C1 ( ... ) ( SELECT * FROM C2);

我们将返回最后插入行的 ID。

有关 PostgreSQL 规则的更多信息
https://postgresql.ac.cn/docs/7.4/interactive/sql-createrule.html
qeremy [atta] gmail [dotta] com
12 年前
只需获取 LAST_INSERT_ID;

<?php
// 注意:等待来自下方 pg_query 的“选择”部分。
// 注意:使用分号 (;) 分隔查询部分。

$qry = pg_query("
INSERT INTO users (id,uname,upass,rep) VALUES (DEFAULT,'bubu','a981v',0.19);
SELECT Currval('users_id_seq') LIMIT 1
"
);

// 或者
$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);
?>

数组
(
[0] => 3 -> 搞定!
)
To Top