PostgreSQL使用正则校验CSV字符串内无重复数字的实现咨询
结论
你的需求完全可以在PostgreSQL环境下通过正则实现,没有超出正则的能力范围,PostgreSQL的正则引擎支持反向引用和正向预查,刚好可以满足重复整数的校验需求。
重复值校验实现方案
你可以新增单独的CHECK约束实现禁止重复整数的规则,约束代码如下:
ALTER TABLE test ADD CONSTRAINT d_no_duplicate_num_ck CHECK (data !~ '(^|,)\s*([1-9]\d*)\s*(?=,.*?\s*\2\s*(,|$))');
该正则的逻辑为:匹配到任意一个合法整数(无前导零)后,正向预查该整数后续是否再次出现完全一致的数字(忽略数字前后的空格),如果存在重复则匹配成功,CHECK约束的!~会判定校验不通过,拦截插入操作。
现有正则优化建议
你当前使用的正则存在冗余的量词,优化后逻辑不变、性能更好,优化后的正则如下:
^\s*[1-9]\d*\s*(?:,\s*[1-9]\d*\s*)*$
优化点说明:
- 去掉了
([1-9]\d*)后多余的+量词,避免不必要的正则回溯 - 使用
\s替代[ ],可以兼容数字前后的制表符(如果仅允许空格,可改回[ ]) - 使用非捕获组
(?:)降低不必要的捕获开销
验证效果
配置完两个约束后:
- 含重复数字的插入语句
('992,1005,1007,992,456,456,1008')会被拦截 - 仅数字前后带空格、无重复的合法数据可正常插入
- 原有的前导零、数字内部含空格的校验逻辑不受影响
内容的提问来源于stack exchange,提问作者Vérace
相关产品推荐
相关产品推荐

