首页 > 解决方案 > jooq - 识别 postgres UNIQUE 约束的问题

问题描述

我正在尝试:

context.insertInto(table(ERROR_TABLE))
  .set(valuesMap)
  .onConflictOnConstraint(constraint(name("push_def_rec_error_idx"))
  .doUpdate()
  .set(field(name(fieldname)), value)
  .execute();

我收到一个错误告诉我:

错误:表“push_error”的约束“push_def_rec_error_idx”不存在

表定义(通过\d+ table_name):

...

Indexes:
    "push_record_error_pkey" PRIMARY KEY, btree (push_record_error_id)
    "push_def_rec_error_idx" UNIQUE, btree (push_definition_id, rec_id)

我究竟做错了什么?

这是针对SQLDialect.POSTGRES_10

标签: postgresqljooq

解决方案


您命名索引的方式,我假设您对这些列没有约束,但是UNIQUE INDEX

CREATE TABLE T (a INT PRIMARY KEY, b INT, c INT);
CREATE UNIQUE INDEX u ON t(b);

INSERT INTO T (a, b, c)
VALUES (1, 2, 3)
ON CONFLICT ON CONSTRAINT u
DO UPDATE SET c = 4
RETURNING *;

以上产生:

[42704]: ERROR: constraint "u" for table "t" does not exist

但是,将索引变成约束:

DROP INDEX u;
ALTER TABLE t ADD CONSTRAINT u UNIQUE (b);

INSERT声明现在有效。

请参阅此处有关唯一约束和唯一索引之间区别的说明。这与 jOOQ 并没有真正的关系


推荐阅读