Версия PostgreSQL: 9.5.4
У меня есть таблица, определенная как:
CREATE TABLE IF NOT EXISTS TEST_1 (
ID SERIAL PRIMARY KEY,
C1 BYTEA,
C2 TEXT NOT NULL,
C3 BOOLEAN NOT NULL DEFAULT FALSE,
CONSTRAINT TEST_1_unique_idx UNIQUE(C1, C2)
);
У меня есть представление, определенное как:
create or replace view test as select * from test_1 with cascaded check
option;
Это необходимо для абстрагирования от имени таблицы, пока код приложения работает через имя представления (для реализации своего рода простого разделения с заменой таблиц при необходимости).
Когда я запускаю следующий запрос в view:
insert into test (c1, c2, c3) values (decode('MTIzAAE=', 'base64'), 'text', true) on conflict (c1, c2) do update set c3=excluded.c3
Я получаю следующую ошибку:
[0A000] ERROR: ON CONFLICT is not supported on table "test" used as a catalog table
Position: 83
Но тот же запрос к table работает, как и ожидалось. Согласно документации Postgres, это должно работать и с представлением, поскольку ON CONFLICT полностью поддерживается с обновляемыми представлениями https://www.postgresql.org/docs/9.5/static/sql-createview.html
Любые идеи, что мне не хватает?
test_1
и фактический код Java, который выполняет ваше выражение (с и без PreparedStatement) - person a_horse_with_no_name   schedule 26.10.2016with check option
. Если убрать то работает. Поскольку вы не ограничиваете строки в представлении, почему вы все равно используетеwith check option
? - person a_horse_with_no_name   schedule 26.10.2016with check option
. Логика изменилась, ноwith check option
осталось. Спасибо что подметил это. Вы правы, это больше не нужно. Безwith check option
работает нормально. Большое спасибо! Любые идеи, почему это происходитwith check option
? Согласно документации, таких ограничений нет. Должен ли я сообщить об этом сообществу Postgres как об ошибке? - person gpotter   schedule 26.10.2016ON CONFLICT
не может работать должным образом, если вы ограничиваете строки, возвращаемые представлением. - person a_horse_with_no_name   schedule 26.10.2016