将输入限制为几个不同的字符串

woo*_*ie1 12 postgresql constraint

嗨,我似乎无法在 postgreSQL 中按照我期望的方式工作。在 pgadmin 中,我执行以下 SQL 查询。

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes');
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';
Run Code Online (Sandbox Code Playgroud)

执行时将转换为。

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" ~ similar_escape('email|post|IRL|minutes'::text, NULL::text));
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';
Run Code Online (Sandbox Code Playgroud)

我希望这会将我对 Types 列的输入限制为电子邮件帖子 IRL 或分钟之一。但是,当输入表数据时,当我输入这些类型之一时,此约束会失败。Types 列是字符类型。有谁知道如何解决这一问题。谢谢。

Chr*_*ers 16

将您的约束更改为

CHECK (type IN ('email','post','IRL','minutes'))
Run Code Online (Sandbox Code Playgroud)

这将由解析器转换为:

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))
Run Code Online (Sandbox Code Playgroud)

那应该做你正在看的。

但是我想知道这样做是否会更好:

CREATE TABLE comlog_types (
     type text
);
Run Code Online (Sandbox Code Playgroud)

然后添加一个外键来强制约束。这将使将来更容易添加类型。

  • 是的,它工作得很好。但您可能还想查看 PostgreSQL 的 [enum 数据类型](http://www.postgresql.org/docs/9.4/static/datatype-enum.html)。 (2认同)