繁体   English   中英

正则表达式约束拒绝 Postgresql 中明显有效的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM