从 PostgreSQL 的角度来看,用伪代码来说:
* $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 版本,您应该选择上述方法之一。当然,理想情况下,使用数据库抽象库来抽象上述内容。否则,在低级代码中,它看起来像:
方法一:插入...返回
// 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];
方法二:INSERT;最后的值()
$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];
方法三:nextval();插入
$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。不过,大多数数据库抽象库尚未使用第一种方法。