我想添加一个约束,它只在表的一部分中对列强制唯一性。
ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);
字符串上面的WHERE部分是一厢情愿。有什么办法吗?或者我应该回到关系绘图板上?
WHERE
bvuwiixz1#
PostgreSQL不定义部分(即条件)UNIQUE约束-但是,您 * 可以 * 创建部分唯一 * 索引 *。PostgreSQL使用唯一索引来实现唯一约束,所以效果是一样的,但有一个重要的警告:你不能像对待唯一约束那样对待唯一索引执行upsert(ON CONFLICT DO UPDATE)。(编辑:显然你现在可以把它和ON CONFLICT一起使用)此外,您也不会看到information_schema中列出的约束。
UNIQUE
ON CONFLICT DO UPDATE
information_schema
CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);
字符串请参阅partial indexes。
cidc1ykv2#
前面已经说过PG没有定义部分(即条件)UNIQUE约束。另外,文档中还说,向表中添加唯一约束的首选方法是ADD CONSTRAINTUnique Indexes向表中添加唯一约束的首选方法是ALTER TABLE... ADD CONSTRAINT。使用索引来强制唯一约束可以被认为是一个不应该直接访问的实现细节。但是,应该注意,没有必要在唯一列上手动创建索引;这样做只会复制自动创建的索引。有一种方法可以使用排除约束来实现它,(感谢@dukelion的这个解决方案)在你的情况下,
ADD CONSTRAINT
ALTER TABLE stop ADD CONSTRAINT myc EXCLUDE (col_a WITH =) WHERE (col_b IS null);
字符串
2条答案
按热度按时间bvuwiixz1#
PostgreSQL不定义部分(即条件)
UNIQUE
约束-但是,您 * 可以 * 创建部分唯一 * 索引 *。PostgreSQL使用唯一索引来实现唯一约束,所以效果是一样的,但有一个重要的警告:你不能像对待唯一约束那样对待唯一索引执行upsert(
ON CONFLICT DO UPDATE
)。(编辑:显然你现在可以把它和ON CONFLICT一起使用)此外,您也不会看到
information_schema
中列出的约束。字符串
请参阅partial indexes。
cidc1ykv2#
前面已经说过PG没有定义部分(即条件)UNIQUE约束。另外,文档中还说,向表中添加唯一约束的首选方法是
ADD CONSTRAINT
Unique Indexes向表中添加唯一约束的首选方法是ALTER TABLE... ADD CONSTRAINT。使用索引来强制唯一约束可以被认为是一个不应该直接访问的实现细节。但是,应该注意,没有必要在唯一列上手动创建索引;这样做只会复制自动创建的索引。
有一种方法可以使用排除约束来实现它,(感谢@dukelion的这个解决方案)
在你的情况下,
字符串