如何在列为 false 时添加复合约束

How to add a composite constraint when a column is false

我都试过了

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

部分索引不能有 UNIQUE 约束。

create table我们可以看到在UNIQUE约束定义中,内联索引语法是:

UNIQUE ( column_name [, ... ] ) index_parameters |

然后index_parameters在UNIQUE、PRIMARY KEY、EXCLUDE约束中是:

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

所以没有地方放置部分索引(WHERE 条件)。

在第二次尝试中,您忘记了 ALTER TABLE artikal_normativi,所以:

ALTER TABLE artikal_normativi
ADD CONSTRAINT artikal_normativi_uix_constraint UNIQUE USING INDEX artikal_normativi_uix;

但是你会遇到不同的问题,那就是约束的限制,包括 UNIQUE:

来自 ADD table_constraint_using_index

的描述

The index cannot have expression columns nor be a partial index. Also, it must be a b-tree index with default sort ordering. These restrictions ensure that the index is equivalent to one that would be built by a regular ADD PRIMARY KEY or ADD UNIQUE command.