Как добавить составное ограничение, когда столбец ложный - PullRequest
0 голосов
/ 10 октября 2019

Я пробовал оба

1)

ALTER TABLE artikal_normativi
  ADD CONSTRAINT "artikal_normativi_UIX" 
  UNIQUE(artikal_proizvod_id, artikal_materijal_id) 
WHERE deleted = false;

2)

CREATE UNIQUE INDEX artikal_normativi_UIX
  ON artikal_normativi
  USING btree(artikal_proizvod_id, artikal_materijal_id) 
  WHERE deleted = false;

ADD CONSTRAINT artikal_normativi_uix_constraint UNIQUE USING INDEX artikal_normativi_uix;

Оба дают мне ошибки.

Ошибка для первого оператора:

ERROR:  syntax error at or near "WHERE"
LINE 2: ...UNIQUE(artikal_proizvod_id, artikal_materijal_id) WHERE dele...
                                                             ^
********** Error **********

ERROR: syntax error at or near "WHERE"

И второе утверждение:

ERROR:  syntax error at or near "USING"
LINE 1: ...i ADD CONSTRAINT artikal_normativi_uix_constraint USING INDE...
                                                             ^

********** Error **********

ERROR: syntax error at or near "USING"
SQL state: 42601
Character: 79

1 Ответ

0 голосов
/ 10 октября 2019

У вас не может быть УНИКАЛЬНОГО ограничения с частичным индексом.

Из создать таблицу мы можем видеть в определении УНИКАЛЬНОГО ограничения, что синтаксис встроенного индекса:

УНИКАЛЬНО(column_name [, ...]) index_parameters |

А затем index_parameters в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE:

[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]

Так что нет места для частичного индекса (ГДЕ условие).

Во второй попытке вы забыли о ALTER TABLE artikal_normativi, поэтому:

ALTER TABLE artikal_normativi
ADD CONSTRAINT artikal_normativi_uix_constraint UNIQUE USING INDEX artikal_normativi_uix;

Но тогда у вас возникнет другая проблема, а это ограничение ограничений, в том числе УНИКАЛЬНОЕ:

Из описания ДОБАВИТЬ table_constraint_using_index

Индекс не может иметь столбцы выражений или не может бытьчастичный индекс . Кроме того, это должен быть индекс b-дерева с порядком сортировки по умолчанию. Эти ограничения гарантируют, что индекс будет эквивалентен индексу, который будет построен обычной командой ADD PRIMARY KEY или ADD UNIQUE.

...