如何在列为 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.
我都试过了
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.