MySQL替代PostgreSQL的自定义数据类型(和域)



在PostgreSQL中,如果我在多个表的多列中存储特定的数据类型(例如mail address(,我可以简单地定义一个具有所有约束的自定义邮件类型,如下所示:

CREATE TYPE status_enum AS enum ('accepted', 'declined', 'awaiting');
CREATE DOMAIN mail_address
AS varchar(100) CHECK(value ~ '[A-Za-z0-9.]+@[A-Za-z0-9]+[.][A-Za-z]+');

然后像这样使用:

CREATE TABLE user (
...
personal_email    mail_address    NOT NULL UNIQUE,
work_email        mail_address    NOT NULL UNIQUE,
status            status_enum     NOT NULL,
...
);
CREATE TABLE job (
...
status            status_enum     NOT NULL,
client_email      mail_address    NOT NULL UNIQUE,
...
);

我发现MySQL不是对象关系数据库,因此没有自定义的数据类型。

我的问题是:

人们如何在MySQL中处理多列中重复出现的数据类型,以防止复制粘贴相同的约束?

对于第一个,您可以使用引用表来实现:

create table statuses (
status int primary key,
status_name varchar(255)
);

然后将使用外键约束来处理这些关系。这不是";奥术;顺便说一下,但在大多数数据库中如何处理这种关系。

第二个将由用户定义的函数处理。大多数数据库在check约束中支持这一点。不幸的是,MySQL要求您使用触发器进行数据验证,但它们都可以使用相同的底层函数。

或者,创建一个电子邮件表,并仅验证该表中的电子邮件。所有其他电子邮件都将使用email_id,而不是电子邮件本身。你可能会发现这是前瞻性的。我发现,出于隐私原因,将这样的PII存储在单独的表中也很有帮助。

最新更新