【问题标题】:PostgreSQL - CREATE TABLE with int4range constraintPostgreSQL - 使用 int4range 约束创建表
【发布时间】: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 是范围类型,不能做成数组。
  • 谢谢阿德里安,我知道我错过了什么。新年快乐!

标签: postgresql constraints


【解决方案1】:

终于明白了。 CONTAINED IN (&lt;@) 运算符正是我要找的。​​p>

我想要的语句是:

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);

【讨论】:

  • 请注意,此代码中消除所示错误的部分是您正在以不同的方式构造范围。在您的原始代码中,您试图将文字解析为int4range[],这意味着“整数范围的数组”;在这段代码中,您正确地构造了一个 int4range
  • @IMSoP 感谢您对此的关注。我学到了艰难的方式...... Adrian的评论让我退后一步,从其他角度看待它,终于在文档中找到了相关的运营商信息。希望您的评论能帮助任何在搜索结果中遇到此问题的人澄清这一点。干杯!
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2011-02-10
  • 2010-11-14
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多