[英]Regexp constraint rejecting apparently valid data in Postgresql
在 pgAdmin 4 v3.0 中使用 Postgres 10.3
我对表my_table 的gridref列上的 GB 国家网格引用有一个约束:
ALTER TABLE my_table
ADD CONSTRAINT my_table_gridref_check
CHECK (gridref::text
~~ '[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'::text);
我有一个似乎与该格式匹配的网格引用(AB12345678 - 即 2 个字母,8 个数字 - 不是真正的网格引用,而是一个有效的模式),但是在尝试插入具有该值的记录时,插入在该约束上失败,出现这个错误
ERROR: new row for relation "my_table" violates check constraint "my_table_gridref_check"
但是,如果我这样做
SELECT select regexp_matches('AB12345678',
'[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
然后我得到了包含该网格参考的单项集。
所有这些似乎都表明应该接受网格引用(这是我所期望的),所以我不明白为什么会触发约束。
任何想法我做错了什么? 在 Postgres 中使用正则表达式作为约束是否有限制或陷阱?
我不得不在文档中查找:
运算符~~相当于LIKE,~~*相当于ILIKE。
Postgres 不支持LIKE
字符范围。
你想要~
(或regexp_match()
):
CHECK (gridref::text ~ '[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'::text);
我猜你真的想要:
CHECK (gridref::text ~ '^[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$'::text);
注意锚点,使其与整个字符串匹配。
或者更简单:
CHECK (gridref::text ~ '^[A-Z]{2}[0-9]{8}$'::text);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.