当域检查在 postgresql 上失败时是否可以获得更好的错误消息?

Is posible to get better error message when a domain check fail on postgresql?

我创建了一个域来捕获空字符串:

CREATE DOMAIN TEXTN AS TEXT
CONSTRAINT non_empty CHECK (length(VALUE) > 0);

然后我将数据库中的所有 text/varchars 字段替换为 TEXTN。

但是,当我遇到错误时,它没有提供太多信息:

DbError { severity: "ERROR", parsed_severity: Some(Error), 
code: SqlState("23514"), 
message: "value for domain textn violates check constraint \"non_empty\"", 
detail: None, hint: None, position: None, where_: None, 
schema: Some("libs"), 
table: None,
column: None, datatype: Some("textn"), 
constraint: Some("non_empty")} 

它甚至没有告诉我检查失败的原因 table 和字段。

如果甚至可以打印要插入的行,但至少 table 和字段是可能的?

PostgreSQL(我检查了版本 11)根本不提供此信息作为协议的一部分。考虑这些陈述:

=> CREATE DOMAIN TEXTN AS TEXT CONSTRAINT non_empty CHECK (length(VALUE) > 0);
CREATE DOMAIN
=> CREATE TABLE test_table (test_column textn);
CREATE TABLE
=> INSERT INTO test_table VALUES ('');
ERROR:  value for domain textn violates check constraint "non_empty"

线路上的错误消息如下所示:

S ERROR
V ERROR
C 23514
M value for domain textn violates check constraint "non_empty\
s public
d textn
n non_empty
F execExprInterp.c
L 3494
R ExecEvalConstraintCheck

没有 test_tabletest_column 的踪迹。

如果您对框架创建 table 的方式有一些控制,则可以使用命名 table 约束而不是域类型,如下所示:

CREATE TABLE test_table (
  test_column text
  CONSTRAINT test_column_check CHECK (length(test_column) > 0));

如果您确保约束名称唯一标识列,则可以使用它来恢复有问题的列。

即使对于在列上定义的 CHECK 约束,如 CREATE TABLE test_table (test_column text CHECK (length(test_column) > 0));,PostgreSQL 也不会报告列名。您只能获得约束的名称,它由 PostgreSQL 在 table 创建时自动生成,通常以列名开头,但不能保证这一点。