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


11

嗨,我似乎无法以我期望的方式在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';

执行后将转换为。

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

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


3
除非我不了解某些内容,否则是否有理由不容易阅读CHECK (type in ('email','post','IRL','minutes')
rfusca 2012年

Answers:


15

将约束更改为

CHECK (type IN ('email','post','IRL','minutes'))

解析器会将其转换为:

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))

那应该做您正在看的。

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

CREATE TABLE comlog_types (
     type text
);

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


谢谢,完美解决了问题。将来我可能会考虑改用外键方法。
wookie1 2012年

2
是的,效果很好。但是您可能还想查看PostgreSQL的enum数据类型
XåpplI'-I0llwlg'I -
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.