postgresql equivalent to $mysqli->insert_id


postgresql equivalent to $mysqli->insert_id

postgresql 9.3中是否有$mysqli->insert_id等价物?我正在导入到一个表中,但我需要获取表中创建的最后一个主键,并将其作为外键应用于第二个表中?表1---->表2填写一条记录。

更多信息:

$sql = "INSERT INTO sheet_tbl (site_id,  eventdate) VALUES ('$_POST[site_id]','$_POST[eventdate]') returning id";

**使用上面的sql,我插入我的记录,然后我将如何在下一个sql插入中使用它,如果我使用返回id,这个id存储在哪里,我如何在另一个insert语句中使用它?

 $sql1 = "INSERT INTO record_tbl (line, taxom_id, number_of_taxom, sheet_id) VALUES (1,1,'$_POST[cased_numbers]','$_POST[sheet_id]')";
  $result = pg_query($sql1);

如果需要刚刚插入的行的PK(或使用表列的任何表达式),可以使用RETURNING子句。文档:RETURNING子句

例如。

test=# create table a (id serial, val text);
NOTICE:  CREATE TABLE will create implicit sequence "a_id_seq" for serial column "a.id"
CREATE TABLE
test=# insert into a (val) values ('foo') returning id;
 id 
----
  1

在PostgreSQL中,主键值通常来自一个序列,这是一种最佳实践。可以使用SELECT currval('sequence_name');获取特定序列的最后一个值,也可以使用SELECT lastval()获取任何序列的最后值。有关详细信息,请参阅官方文档。

您可以看到currval在这个SQL fiddle中工作的示例。请注意,需要像插入一样使用会话中已经存在的序列。当当前会话中尚未使用序列时调用currval是错误的。

如果你在PHP中使用PDO,PostgreSQL支持lastInsertId方法,但要求你提供序列ID。有更多关于PDO::lastInsertId的文档和讨论。

正如@bma所建议的,在INSERT语句中使用RETURNING子句是一种很好的方法,可以返回刚刚插入的行的主键值:

insert into a (val) values ('foo') returning id;

此外,您的语法似乎很容易受到SQL注入攻击,因为您将未经验证的输入直接传递到数据库中,而没有对其进行转义。请考虑使用pg_query_params或其他替代方法,以确保正确地对输入进行转义。

实际上,您可以在一个查询中完成:

WITH sheet AS(
    INSERT INTO sheet_tbl (site_id,  eventdate) VALUES ('$_POST[site_id]','$_POST[eventdate]') returning id
)
INSERT INTO record_tbl select 1,1,'$_POST[cased_numbers]',id FROM sheet;