PostgreSQL是否有mysql_insert_id() php函数的替代方案?大多数框架通过查找ID中使用的序列的当前值部分解决了这个问题.然而,有时主键不是串行列....

推荐答案

从PostgreSQL的Angular 来看,在伪代码中:

 * $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的地方有效.自PostgreSQL 8.1以来,OID已默认关闭.

因此,根据您拥有的PostgreSQL版本,您应该 Select 上述方法之一.当然,理想情况下,使用一个数据库抽象库来抽象上述内容.否则,在低级代码中,它看起来像:

Method one: INSERT... RETURNING

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

Method two: 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];

Method three: nextval(); INSERT

$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.不过,大多数数据库抽象库还没有使用第一种方法.

Postgresql相关问答推荐

GORM Golang SQL查询执行不区分大小写的搜索不起作用

在Postgres中如何连接具有相同名称列的表并更改列名称?

使用 pgx 扫描范围类型

如何在docker-compose中使用docker secrets设置ConnectionString?

IF 块中的 CREATE FUNCTION 语句抛出错误,同时运行它自己的作品

Postgres 视图定义 (pgAdmin) 被删除了 comments ?

gorm 创建并返回值 many2many

Postgres - 如何加入两列?

SELECT INTO 具有多个归因

在查询中的复合外键/主键列上连接表

如何使 Java 和 Postgres 枚举一起工作以进行更新?

Postgres UPDATE with ORDER BY,怎么做?

Postgres jsonbNOT contains运算符

Postgres 表中列的顺序会影响性能吗?

如何使用 Node.js 和 Postgresql 找到最后一个插入 ID?

PostgreSQL 条件 where 子句

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

PGAdmin 编辑数据

如何使用 sql 或 phpPgAdmin 更改 PostgreSQL 数据库的数据库编码?

在 pg_restore 期间排除表