Postgres不能正确返回lastval()。[英] Postgres not returning lastval() properly

本文是小编为大家收集整理的关于Postgres不能正确返回lastval()。的处理方法,想解了Postgres不能正确返回lastval()。的问题怎么解决?Postgres不能正确返回lastval()。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试通过 CLI 中的 psql 将新用户插入到我们的数据库中.当我执行以下操作时:

START TRANSACTION;
INSERT INTO "users" ("email", "first_name", "last_name", "password", "objectstate_id", "activate_rid")
VALUES ('xpress@carepilot.com', 'Xpress', 'Care', 'f9fecdd84ee071806423adf30d6d6ff04e1a0a2c6688f2c057ddbab1d6b55d02', 4, 'EMQHTMMvViAB5BdYj0E6');
SELECT LASTVAL();

LASTVAL 总是返回 39037,从技术上讲应该是 838.由于某种原因,它也没有将其插入数据库.我已经用谷歌搜索并寻找了我能想到的所有东西,但没有得到任何答案.有谁知道这里发生了什么?

推荐答案

这里的简短版本是使用不合格的 lastval 是个坏主意.触发器、规则等可能会导致问题.

你应该完全避免lastval.使用:

BEGIN;

INSERT INTO "users" ("email", "first_name", "last_name", "password", "objectstate_id", "activate_rid") 
VALUES ('xpress@carepilot.com', 'Xpress', 'Care', 'f9fecdd84ee071806423adf30d6d6ff04e1a0a2c6688f2c057ddbab1d6b55d02', 4, 'EMQHTMMvViAB5BdYj0E6') 
RETURNING id;

其中 id 应该是生成的键列的名称.

这种方法将正确处理多值插入和 INSERT INTO ... SELECT ...,并且不会出现触发器接触序列的问题.

如果您必须使用基于函数调用的方法,至少使用 currval('tablename_id_seq')(传递适当的序列名称)而不是 lastval.

本文地址:https://www.itbaoku.cn/post/1763896.html