Postgresql 如何在postgres中检查是否定义了lastval()

Postgresql 如何在postgres中检查是否定义了lastval(),postgresql,Postgresql,我正在创建一个迷你DB处理类,为了方便起见,我希望生成的INSERT查询总是尝试返回最后一个INSERT id或null(如果不适用)。我曾尝试使用: 插入到。。。返回lastval() 它适用于具有序列的表,但如果表没有序列键字段,则不会插入任何内容并出现错误:lastval在此会话中尚未定义 如何签入重新运行块,此会话中是否使用了序列生成器,或是以静默方式返回上一个id或null,而不会引发错误 注意:出于使用目的,我希望避免直接指定PK字段名。这是Postgres的问题。对于没有序列的表,

我正在创建一个迷你DB处理类,为了方便起见,我希望生成的INSERT查询总是尝试返回最后一个INSERT id或null(如果不适用)。我曾尝试使用:

插入到。。。返回lastval()

它适用于具有序列的表,但如果表没有序列键字段,则不会插入任何内容并出现错误:
lastval在此会话中尚未定义

如何签入
重新运行
块,此会话中是否使用了序列生成器,或是以静默方式返回上一个id或null,而不会引发错误


注意:出于使用目的,我希望避免直接指定PK字段名。

这是Postgres的问题。对于没有序列的表,它会显示此错误。

这是Postgres的问题。对于没有序列的表,它会显示此错误。

returning
子句中直接指定列是唯一的解决方案。
插入到。。。返回列名
曾讨论过支持类似于
返回生成的键
返回主键
功能的东西,但它在实现细节上陷入了困境,结果比最初看起来要复杂得多。所以在这一点上,是的,你只需要使用列名,或者
*
。您可以从
信息\u架构
中查找关键列,并根据需要动态修改SQL。请参阅带有用户存储函数的解决方案很好,唯一的一个小缺点是,它需要预初始化。有没有办法内联运行这样的函数<代码>执行
在这里似乎不起作用。带有
*
的解决方案看起来也很有趣,假设PK始终是第一个字段,它可以在程序中作为insert id中继。有没有办法只从
*
中选择第一个字段而不访问
信息\u架构
?唯一的解决方案是在
返回
子句中直接指定列。
插入到。。。返回列名
曾讨论过支持类似于
返回生成的键
返回主键
功能的东西,但它在实现细节上陷入了困境,结果比最初看起来要复杂得多。所以在这一点上,是的,你只需要使用列名,或者
*
。您可以从
信息\u架构
中查找关键列,并根据需要动态修改SQL。请参阅带有用户存储函数的解决方案很好,唯一的一个小缺点是,它需要预初始化。有没有办法内联运行这样的函数<代码>执行
在这里似乎不起作用。带有
*
的解决方案看起来也很有趣,假设PK始终是第一个字段,它可以在程序中作为insert id中继。有没有办法只从
*
中选择第一个字段,而不访问
信息\u架构