如何跳过 INSERT 语句中引发的异常?

How to skip exception raised in INSERT statement?

当我运行以下SQL代码时:

INSERT INTO table
(column1, column1)
SELECT column1, column2
FROM other_table
WHERE column2 = 'foo'
ON CONFLICT DO NOTHING;

我明白了

PG::CheckViolation: ERROR:
new row for relation "table" violates
check constraint "tables_column1_valid_first_char"

如何跳过违反该检查约束的行?

我试过了

INSERT INTO table
(column1, column1)
SELECT column1, column2
FROM other_table
WHERE column2 = 'foo'
ON CONFLICT  ON CONSTRAINT tables_column1_valid_first_char DO NOTHING;

但是失败了

PG::WrongObjectType: ERROR:
constraint in ON CONFLICT clause has no associated index

约束如下所示:

ADD CONSTRAINT tables_column1_valid_first_char
  CHECK (SUBSTRING(text, 1,1) ~* '^[a-zàâçéèêëîïôûùüÿæœ]');

ON CONFLICT 仅处理唯一约束,不适用于检查约束(或外键约束)。

您需要通过应用 WHERE 子句排除这些行:

INSERT INTO table (column1, column1)
SELECT column1, column2
FROM other_table
WHERE column2 = 'foo'
  and SUBSTRING(column1, 1,1) ~* '^[a-zàâçéèêëîïôûùüÿæœ]'
ON CONFLICT DO NOTHING;