据我了解,每个值仅由序列发出一次。如果您使用 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 实例;以前,期望一个 resource。 |
示例 #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 中的“select”部分。
// 注意:使用分号 (;) 分隔查询部分。
$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 -> 得到它!
)