类型中的 Postgresql 正则表达式而不是检查约束

标签 postgresql types

这个问题大致基于 How can I create a constraint to check if an email is valid in postgres?

我知道我可以使用字符串类型并通过检查约束来约束它:

CREATE TABLE emails (
  email varchar
  CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$')

);

但是,我希望能够创建一个自定义类型,以便语法如下

create table emails (
    email email_address
);

我本以为CREATE TYPE会在这里使用,但由于这不是复合、范围或枚举类型,我不确定我将如何处理它。

郑重声明,这是因为我有多个表都具有相同的检查约束。我想在一个地方调整约束(也许通过一种类型),而不是一个一个地浏览所有表格。我认为它还可以使表定义看起来更好(它不适用于电子邮件,但如果针对“email_address”类型解决它则直接适用)。

documentation说您可以使用输入和输出函数将字符串自动装箱为特定类型。也许如果我在收到无效的 cstring 时引发异常,它可能会以这种方式工作,但它似乎是一个大锤,特别是考虑到我仍然希望它毕竟是一个字符串;只是一点语法糖/重复数据删除。

最佳答案

使用 domain.

create domain email_address as text
    check (value ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$')

例子:

select 'abc'::email_address;

ERROR:  value for domain email_address violates check constraint "email_address_check"

select 'abc@mail.com'::email_address;

 email_address 
---------------
 abc@mail.com
(1 row)

关于类型中的 Postgresql 正则表达式而不是检查约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46697011/

相关文章:

arrays - C 指向 int(*)[row] 类型的动态数组的指针,其中 row 在结构内部未分配

postgresql - 如何从 PGAdmin4 连接到 docker Postgres 服务器

node.js - Seqeulize PostgreSQL ORM (Node.js) 中的 CHECK 约束

python - PostgreSQL 异常 : DB_Cursor: exception in execute: tuple concurrently updated

c# - 如何在 C# 中检查一个字符串不是关键字或类型

java - 为什么 Gson 序列化的是列表中的运行时类型,而不是指定的编译时类型?

function - 显式转换涉及特定功能项类型的类型

postgresql - 如何获取事务中的当前查询

mysql - 主键未与我的 Sequelize 表一起生成

sql - SQL 中的 CHAR 数据类型是否已过时?你什么时候使用它?