我正在使用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中存储字符串值而不是数字或特殊字符
我该怎么做?
答案 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).