【发布时间】:2020-12-27 14:15:49
【问题描述】:
我想在创建表时使用范围约束,因为它看起来比我目前正在做的更优雅:
DROP TABLE IF EXISTS "coa_sandbox"."account_list";
CREATE TABLE "coa_sandbox"."account_list" (
id serial unique not null,
account_number int unique not null CONSTRAINT within_range CHECK (account_number >= 10000 AND account_number <= 99999),
account_name text unique not null
) WITH (oids = false);
也许这很傻,但我认为使用 int4range 似乎是一种更专业的方法。
我一直在使用 Erwin Brandstetter 解决此问题的方法 [https://stackoverflow.com/a/35028185] 作为灵感,但没有成功。我在上面重新创建了我的表,没有约束,然后尝试更改表。我开始了:
ALTER TABLE "coa_sandbox"."account_list" ADD CONSTRAINT within_range
CHECK ("account_number" = ANY ('{9999,99999}'::int4range[]));
...结果如下:
Error in query: ERROR: malformed range literal: "9999"
DETAIL: Missing left parenthesis or bracket.
请注意,我使用的是 Adminer 4.7.8 来执行这些查询。
我继续尝试使用括号、花括号和圆括号的不同组合,使用错误详细信息和我对 Perl 中这些项目的中级知识水平作为影响。
我得到了 nuthin'。我一直在搜索 PostgreSQL 文档以获取有关语法的详细信息,如果解决方案很明显,那么我只是没有看到它。
有人可以直接告诉我吗?如果我最初的工作解决方案是最好的方法,请告诉我。如果我正朝着正确的方向前进,但错过了正确的细节,请告诉我我错过了什么。
谢谢。
【问题讨论】:
-
您将范围类型与数组混合。
'{9999,99999}'是一个数组构造,[]将某些东西标记为给定类型的数组。int4range是范围类型,不能做成数组。 -
谢谢阿德里安,我知道我错过了什么。新年快乐!