PostgreSQL 14.4使用UNIQUE NULLS NOT DISTINCT报语法错误求助
问题解答
错误原因
PostgreSQL 14.4版本不支持UNIQUE NULLS NOT DISTINCT语法,这个特性是PostgreSQL 15才正式引入的,14及更低版本没有对应的配置项可以启用该语法,所以执行时会触发语法错误。
替代实现方案
根据你的需求(同一code搭配不同sub_code可重复,但无sub_code的code仅能存在一条),可以用以下两种方式实现:
方式1:部分唯一索引
直接创建仅对sub_code IS NULL生效的唯一索引,精准限制无sub_code时的code唯一性:
CREATE UNIQUE INDEX idx_codes_code_null_subcode ON codes (code) WHERE sub_code IS NULL;
这种方式只约束sub_code为空的行,sub_code非空时,同一code可以搭配任意不同的sub_code,完全匹配你的需求。
方式2:函数式唯一索引
通过COALESCE将NULL转换为一个特殊标记值,创建包含转换后值的唯一索引:
CREATE UNIQUE INDEX idx_codes_code_subcode ON codes (code, COALESCE(sub_code, '<unique-null-marker>'));
这种方式会把所有sub_code为NULL的行视为同一个组合,从而确保同一code下只能有一条sub_code为空的记录,同时允许非空sub_code的组合自由存在。
内容的提问来源于stack exchange,提问作者Touring Tim
相关产品推荐
相关产品推荐

