CREATE EXTENSION citext;
CREATE DOMAIN domain_email AS citext
CHECK(
VALUE ~ '^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$'
);
-- for valid samples
SELECT 'some_email@gmail.com'::domain_email;
SELECT 'accountant@dbrnd.org'::domain_email;
-- for an invalid sample
SELECT 'dba@aol.info'::domain_email;
正如Neil所指出的那样,它就像使用自定义类型。
CREATE DOMAIN
创建新的域。域本质上是一种带有可选约束(对允许值集的限制)的数据类型。 来源
对于那些不熟悉用于检查值的怪异字符的人来说,它是正则表达式模式。
以下是在表格中使用的示例:
CREATE TABLE sample_table ( id SERIAL PRIMARY KEY, email domain_email );
-- The following is invalid, because ".info" has 4 characters
-- the regex pattern only allows 2-3 characters
INSERT INTO sample_table (email) VALUES ('sample_email@gmail.info');
ERROR: value for domain domain_email violates check constraint "domain_email_check"
-- The following query is valid
INSERT INTO sample_table (email) VALUES ('sample_email@gmail.com');
SELECT * FROM sample_table;
id | email
----+------------------------
1 | sample_email@gmail.com
(1 row)
感谢Neil提供的建议。
过去我使用文本或varchar或字符变量
varchar
在Postgres中是一种有效的数据类型(它是character varying
的别名)。https://dbfiddle.uk/?rdbms=postgres_12&fiddle=d8c0bf80f3e989d92fbf69da7cc553bc - user330315varchar
是 character varying
的别名。当然你可以使用 character varying
。最初我也使用了它,但后来我更喜欢使用 varchar
,特别是如果你需要限制长度(这种情况下使用 varchar(N)
或简单的 text
)。 - Mariacharacter varying(150)
是有效的。 - user330315我建议您使用CITEXT
类型,该类型在值比较中忽略大小写。对于电子邮件来说,这很重要,以防止重复,例如username@example.com和UserName@example.com。
此类型是citext
扩展的一部分,可以通过以下查询激活:
CREATE EXTENSION citext;