PostgreSQL - 使用 int4range 约束创建 TABLE

PostgreSQL - CREATE TABLE with int4range constraint

我想在创建 table 时使用范围约束,因为它看起来比我目前正在做的更优雅:

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 对这个问题的解决方案 [ 作为灵感,但没有成功。我在上面重新创建了 table,没有约束,然后尝试更改 table。我开始于:

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 中这些项目的中等知识水平作为影响。

我没有什么。我一直在 PostgreSQL 文档中搜索有关语法的详细信息,如果解决方案很明显,那么我只是没有看到它。

有人可以直接告诉我这个吗?如果我最初的工作解决方案是最好的方法,请告诉我。如果我正朝着正确的方向前进但缺少正确的细节,请告诉我我缺少什么。

谢谢。

终于想通了。 CONTAINED IN (<@) 运算符正是我要找的。

我想要的语句是:

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" <@ int4range(10000,100000)),
account_name text unique not null
) WITH (oids = false);