1

在 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);
4

3 回答 3

3

如果您需要刚刚插入的行的 PK(或使用表列的任何表达式),您可以使用 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
于 2013-07-25T14:41:52.210 回答
1

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

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

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

正如@bma 所建议的,RETURNING在语句中使用子句INSERT是获取刚刚插入的行的主键值的好方法:

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

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

于 2013-07-25T14:35:34.760 回答
0

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

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;
于 2013-07-27T07:02:08.957 回答