PostgreSQL UNIQUE 约束错误消息

Mag*_*nus 5 postgresql php error-handling unique-constraint

附录 A:PostgreSQL 错误代码中,它说:

对于某些类型的错误,服务器会报告与错误关联的数据库对象(表、表列、数据类型或约束)的名称;例如,导致 unique_violation 错误的唯一约束的名称。此类名称在错误报告消息的单独字段中提供,以便应用程序无需尝试从消息的可能本地化的人类可读文本中提取它们。

大胆强调我的。我有下表:

CREATE TABLE recipes (
    id SERIAL,
    title TEXT UNIQUE NOT NULL,
    description TEXT NOT NULL,
    instructions TEXT NOT NULL,
    image BYTEA,
    CONSTRAINT recipes_pk PRIMARY KEY(id),
    CONSTRAINT title_unique UNIQUE(title)
);
Run Code Online (Sandbox Code Playgroud)

当我尝试插入具有重复标题的新行时,我在 pgAdmin3 中收到以下错误消息:

ERROR:  duplicate key value violates unique constraint "title_unique"
DETAIL:  Key (title)=(mytitle) already exists.
Run Code Online (Sandbox Code Playgroud)

或者,使用 PHP:

["errorInfo"]=>
  array(3) {
    [0]=>
    string(5) "23505"
    [1]=>
    int(7)
    [2]=>
    string(117) "ERROR:  duplicate key value violates unique constraint "title_unique"
                 DETAIL:  Key (title)=(mytitle) already exists."
  }
Run Code Online (Sandbox Code Playgroud)

根据 PostgreSQL 文档中的段落,约束名称不应该title_unique在错误信息的单独字段中找到吗?

我正在使用 PostgreSQL 9.4.5。

Erw*_*ter 3

例如,您可以在 PL/pgSQL 中的异常处理程序内读取引用中提到的这些单独字段(按照手册中的说明,如 @dezso 评论):

\n\n
DO\n$$\nDECLARE\n   err_constraint text;\n\nBEGIN\n   INSERT INTO recipes (title) VALUES (\'foo\'), (\'foo\');  -- provoke unique violation\n\nEXCEPTION\n   WHEN SQLSTATE \'23000\' THEN  -- Class 23 \xe2\x80\x94 Integrity Constraint Violation\n      GET STACKED DIAGNOSTICS err_constraint = CONSTRAINT_NAME;\n      -- do something with it, for instance:\n      RAISE NOTICE \'%\', err_constraint;\n      RAISE;  -- raise original error\n\nEND;\n$$\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
注意:title_unique\n\n错误:重复的键值违反了唯一约束“title_unique”\n详细信息:键 (title)=(foo) 已存在。\n上下文:SQL 语句“INSERT INTO Recipes (title) VALUES (\'foo\' )"\nPL/pgSQL 函数 inline_code_block 第 5 行 SQL 语句
\n\n

另外:您在 DDL 命令中声明了两次唯一约束。(令我惊讶的是,这导致我在第 9.5 页的测试中出现了一个约束)。不管怎样,只做一次

\n\n
CREATE TABLE recipes (\n    id SERIAL,\n    title TEXT NOT NULL,  -- remove redundant clause\n    description TEXT NOT NULL,\n    instructions TEXT NOT NULL,\n    image BYTEA,\n    CONSTRAINT recipes_pk PRIMARY KEY(id),\n    CONSTRAINT title_unique UNIQUE(title)\n);\n
Run Code Online (Sandbox Code Playgroud)\n