问题描述
在 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 存储在单独的表中也有助于保护隐私。