一个命令标签
是 PostgreSQL 在成功执行除SELECT
之外的 SQL 命令后返回的关键字。
通常,命令标签是刚刚执行的命令,例如:
postgres=# BEGIN ; BEGIN postgres=*# CREATE TABLE foo(id INT); CREATE TABLE postgres=*# INSERT INTO foo values(1); INSERT 0 1 postgres=*# UPDATE foo SET id = 2 WHERE id = 1; UPDATE 1 postgres=*# DELETE FROM foo; DELETE 1
SELECT
(以及TABLE
)不返回命令标签,但INSERT
/UPDATE
/DELETE
与RETURNING
子句结合使用时会返回。
postgres=# INSERT INTO foo values(1) RETURNING id; id ---- 1 (1 row) INSERT 0 1 postgres=# SELECT * FROM foo; id ---- 1 (1 row)
在某些情况下,如果执行的命令导致不同的解析结果,则返回的命令标签将不同,例如:
postgres=# BEGIN; BEGIN postgres=*# SELECT foo; ERROR: column "foo" does not exist LINE 1: SELECT foo; ^ postgres=!# COMMIT; ROLLBACK
还有一些情况,命令实际上是另一个命令的别名;在这种情况下,实际命令将作为命令标签返回,例如:
postgres=*# END; COMMIT
内部实现
命令标签作为前端/后端协议的CommandComplete
消息的一部分传递回客户端。
由客户端决定如何处理命令标签。
在libpq中,PQcmdStatus()
函数返回命令标签。
参考文献
- PostgreSQL 文档: 消息格式