PostgreSQL插入确认参数的含义是什么?

37

在我的 LiveCode Server 应用程序中,插入时返回了 dberr,但没有明确的错误代码。

我进入终端以 Postgres 用户身份手动执行了插入操作。

%My_Dbase=# INSERT INTO new-table (first_name, last_name, anonymous) VALUES ('batman', 'Moonboy', TRUE);

psql 进程返回:

INSERT 0 1
这行代码是什么意思?除了主表之外,我还有一个序列来递增主表的主键ID(int)。
如果我检查数据,数据被插入,主键递增1,一切看起来都很好,但我不确定为什么我的应用会返回错误(可能是应用程序或我的代码中的错误)。
但是,如果我知道"INSERT 0 1"的含义,那将有助于我确保:
1. 是的,插入已经完成且没有错误;或者 2. 不,"0 1"表示某种错误。
如果有人能提供PostgreSQL文档链接,告诉我这些服务器响应参数是什么,我会去学习...我已经到处找过了。
2个回答

49

来自手册中相关页面的节选:

输出

成功完成后,INSERT命令会返回一个形如

INSERT oid count

的命令标签。其中,count为插入的行数。如果count恰好为1,并且目标表包含OIDs,则oid为分配给已插入行的OID。否则,oid为0。


7
作为对这个答案的补充,假设你的表中有一个名为"id"的字段,它通过序列自动分配,如果你以以下形式运行插入语句:"INSERT INTO new-table (first_name, last_name, anonymous) VALUES ('batman', 'Moonboy', TRUE) RETURNING id",那么"INSERT 0 1"的消息将被刚插入记录中新id的值所替代。 - Matthew Wood
你们知道在这个上下文中 INSERT 0 0 是什么意思吗?我没有收到任何错误,只有这个。 - jayarjo
1
@jayarjo - 这意味着您的插入失败了(第二个0)。 - Ray Jennings

12

编辑:我被指向了这篇文档,https://www.postgresql.org/docs/14/protocol-message-formats.html

格式为COMMAND OID ROWS

由于OID系统列不再被支持,所以OID总是为零。

所以你看到的是你已经执行了一个插入操作,OID为零,并插入了一行。

换句话说,你的命令已经成功完成了!


优秀的,谢谢你,后来我确定了。我的意思是,如果我在phpPGsql管理界面中看到数据...我必须假设它正在工作。@马修:返回主键ID的提示非常有用...虽然我有一个,但它的名称是“donation_id”,并通过关联序列自动递增。 - katir
那么 INSERT 0 0 是什么意思呢?比如说 - “成功插入了空值”?最近经常遇到这种情况。 - jayarjo
1
@jayarjo 可以考虑在 StackOverflow 上提出一个新问题。但是,如果在引号中搜索“INSERT 0 0”,则可以找到 https://pgdash.io/blog/postgres-insert.html,其中讲述了 ON CONFLICT [...] DO NOTHING 如何返回冲突的“INSERT 0 0”。因此,它确实看起来意味着插入操作成功,并且没有插入任何行。我不知道除 ON CONFLICT 之外是否还有其他情况会发生这种情况,因为我已经很长时间没有使用过 postgres。 - SamStephens
1
我知道这是一篇旧帖子,但我已经在错误的推断上应用了删除线,即INSERT 0 1中的第一个数字是状态码。正如其他答案和文档所述:https://www.postgresql.org/docs/14/protocol-message-formats.html 这是一个CommandComplete字符串。插入行的第一个数字可能是OID,但不是状态码。 - bitoffdev
1
感谢@bitoffdev。保留行位可能仍然有价值,因为那仍然是正确推断的有用部分。我现在会修复它。 - SamStephens
1
感谢快速回复,谢谢@SamStephens! :) - bitoffdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接