Как пропустить исключение, возникающее в операторе INSERT? - PullRequest
0 голосов
/ 30 октября 2019

Когда я запускаю следующий код 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àâçéèêëîïôûùüÿæœ]');

1 Ответ

1 голос
/ 30 октября 2019

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;
...