命令标签 是 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 文档: 消息格式
