mysql_insert_id替代postgresql

时间:2008-09-11 07:37:00

标签: php postgresql insert-id

对于PostgreSQL有mysql_insert_id() php函数的替代方法吗?大多数框架通过查找ID中使用的序列的当前值来部分解决问题。但是,有时候主键不是串行列....

4 个答案:

答案 0 :(得分:43)

从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版本,您应该选择上述方法之一。当然,理想情况下,使用数据库抽象库来抽象上述内容。否则,在低级代码中,它看起来像:

方法一: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];

方法二: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];

方法三: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。大多数db抽象库还没有使用第一种方法。

答案 1 :(得分:3)

查看RETURNING optional clause以获取INSERT语句。 (链接到PostgreSQL官方文档)

但基本上,你这样做:

INSERT INTO table (col1, col2) VALUES (1, 2) RETURNING pkey_col

并且INSERT语句本身返回受影响行的id(或您指定的任何表达式)。

答案 2 :(得分:3)

来自php.net:

$res=pg_query("SELECT nextval('foo_key_seq') as key");
$row=pg_fetch_array($res, 0);
$key=$row['key'];
// now we have the serial value in $key, let's do the insert
pg_query("INSERT INTO foo (key, foo) VALUES ($key, 'blah blah')");

这应始终提供唯一键,因为从数据库检索的密钥将永远不会再次检索。

答案 3 :(得分:3)

您也可以使用:

$result = pg_query($db, "INSERT INTO foo (bar) VALUES (123) RETURNING foo_id");
$insert_row = pg_fetch_result($result, 0, 'foo_id');

你必须在pg_fetch_result中指定行的编号和你要查找的字段的名称,这是获取所需数据的更精确方法,但我不知道这是否有一些查询性能中的惩罚。请记住,此方法适用于PostgreSQL版本8.2及更高版本。