如何创建Postgres列以仅接受文本

时间:2017-10-13 11:42:36

标签: postgresql

我正在使用postgresql,我创建了一个带有id和varchar字段的用户表。

CREATE TABLE "USER_MGMT"."USER"
(
    "USER_ID" bigint NOT NULL DEFAULT nextval('"USER_MGMT"."USER_SEQ"'::regclass),
    "FIRST_NAME" character varying(50)  COLLATE pg_catalog."default" NOT NULL,
    "LAST_NAME" character varying(50) COLLATE pg_catalog."default" NOT NULL);

我想只在firstname中存储字符串值而不是数字或特殊字符

我该怎么做?

3 个答案:

答案 0 :(得分:4)

可以使用检查约束:

CONSTRAINT fn_check CHECK (firstname ~ '^[A-Za-z ]+$')

但是如果你在应用程序的上下文中使用Postgres,我真的认为你应该在你的应用程序层中处理它。实际上,你通常会有几道防线,第一道是UI侧验证。有人进入服务器的任何名字都将被取出,数据库不需要有太多的逻辑。

答案 1 :(得分:1)

使用check约束。您可以使用正则表达式输入所需的字符列表。例如:

constraint chk_first_name check (first_name ~ '^[a-zA-Z]+$')

或排除某些值:

constraint chk_first_name check (not first_name ~ '[^0-9!@#$%^&*()]')

答案 2 :(得分:1)

像往常一样:

f=# CREATE TABLE "USER_MGMT"."USER"
(
    "USER_ID" SERIAL,
    "FIRST_NAME" character varying(50)  COLLATE pg_catalog."default" NOT NULL CHECK ("FIRST_NAME" ~* '^[A-Za-z]+$'),
    "LAST_NAME" character varying(50) COLLATE pg_catalog."default" NOT NULL);
CREATE TABLE
f=# insert into "USER_MGMT"."USER"("FIRST_NAME","LAST_NAME") select 'a1','a';
ERROR:  new row for relation "USER" violates check constraint "USER_FIRST_NAME_check"
DETAIL:  Failing row contains (2, a1, a).