You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:18:03