ON CONFLICT 中的 Postgresql 多列

Postgresql multiple columns in ON CONFLICT

如果该行中的每个单元格都是唯一的(当然不包括 id 字段),我只想插入一行,所以我尝试了这个

INSERT INTO test (val, val2, val3) VALUES ('g', 'h', 'j') 
ON CONFLICT (val, val2, val3) DO NOTHING RETURNING id;

但事实证明这是无效的,因为传递给 ON CONFLICT 的字段必须受到 UNIQUE 的约束。但我不希望那样,我只希望 val、val2 和 var3 的排列是唯一的,我不希望它们单独是唯一的。在插入之后,无论是否插入,我都想 return id 字段。我该怎么做?

我通过像这样创建 UNIQUE 解决了这个问题:

CREATE TABLE test (
  id SERIAL,
  val varchar(100),
  val2 varchar(100),
  val3 varchar(100),
  UNIQUE (val, val2, val3)
);

然后像这样插入:

INSERT INTO test (val, val2, val3) VALUES ('a', 'b', 'c') ON CONFLICT (val, val2, val3) DO UPDATE SET val='a' RETURNING id;

即使没有什么可更新的,它也会return id