我需要在PostgreSQL中创建domain
的价格。价格必须是NUMERIC(9,2)
,其中9是精度,2是比例。在尝试创建域获取时:
ERROR: operator does not exist: numeric ~* unknown
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY:
CREATE DOMAIN d_price AS NUMERIC(9, 2) NOT NULL
CONSTRAINT Product_price_can_contain_only_double_precision_value
CHECK(VALUE ~*'^(([[:digit:]])+\.([[:digit:]]){2})$');
答案 0 :(得分:4)
在使用字符串运算符之前,您需要将数值作为字符串,将VALUE
更改为:CAST(VALUE AS TEXT)
答案 1 :(得分:4)
您的CHECK
约束是荒谬的,因为它在之后应用了,该值已被数据库引擎的数字解析器转换为NUMERIC
。
VALUE ~*'^(([[:digit:]])+\.([[:digit:]]){2})$')
似乎说“一个或多个前导数字,一个句号,正好两个尾随数字”。一旦解析了数字,就无法以任何有用的方式进行检查。观察:
regress=> SELECT NUMERIC(18,2) '1', NUMERIC(18,2) '1.12345';
numeric | numeric
---------+---------
1.00 | 1.12
(1 row)
无论输入是什么,如果它适合您指定的NUMERIC
,它将被扩展为适合。如果它不符合您提供的NUMERIC
大小,则会在CHECK
约束运行之前产生错误。