据我了解,每个值仅由序列发出一次。如果您使用 nextval() 从序列中检索一个数字(例如 12),序列将前进,对 nextval() 的后续调用将返回序列中进一步的数字(12 之后)。
这意味着如果您使用 nextval() 检索一个值用作主键,您可以保证该序列上对 nextval() 的任何其他调用都不会返回相同的值。没有竞争条件,不需要事务。
据我所知,那就是序列的 *用途* :^)
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_last_oid — 返回最后一行 的 OID
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()。
版本 | 描述 |
---|---|
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);
?>
据我了解,每个值仅由序列发出一次。如果您使用 nextval() 从序列中检索一个数字(例如 12),序列将前进,对 nextval() 的后续调用将返回序列中进一步的数字(12 之后)。
这意味着如果您使用 nextval() 检索一个值用作主键,您可以保证该序列上对 nextval() 的任何其他调用都不会返回相同的值。没有竞争条件,不需要事务。
据我所知,那就是序列的 *用途* :^)
正如繁忙站点所指出的,上面提到的某些方法实际上可能会给出错误的答案,因为在您的插入和选择之间插入了另一条记录。为了解决这个问题,请将其放入事务中,并在完成所有操作之前不要提交。
这个函数非常有用 :)
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];
}
在插入后简单调用;)
您可以使用它来获取最后一个插入的 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。
我在网上分享了一个优雅的解决方案(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
只需获取 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 -> 搞定!
)