如何跨多个表强制实施唯一约束?
How to enforce a unique constraint across multiple tables?
我创建了以下两个 tables 来映射学生和教师:
CREATE TABLE students(
student_id SERIAL PRIMARY KEY,
first_name NOT NULL VARCHAR(50),
last_name NOT NULL VARCHAR(50),
phone VARCHAR(15) UNIQUE NOT NULL CHECK (phone NOT LIKE '%[^0-9]%'),
email VARCHAR(30) UNIQUE NOT NULL CHECK (email NOT LIKE '%@%'),
graduationYear SMALLINT CHECK (graduationYear > 1900)
);
CREATE TABLE teachers(
teacher_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
departament VARCHAR(40) NOT NULL,
email VARCHAR(30) UNIQUE NOT NULL CHECK (email NOT LIKE '%@%'),
phone VARCHAR(15) UNIQUE NOT NULL CHECK (phone NOT LIKE '%[^0-9]%')
);
如您所见,两个 table 都有 phone
和 email
的列。我希望这两个对每个人来说都是 独一无二的。
我如何引入一个约束来检查引入的 phone number/email,例如,在 students
table 中是否已经存在teachers
table?
是否有任何类型的关键字像 UNIQUE 一样工作但在多个 table 上,还是我应该采用另一种方法?
编辑:正如@a_horse_with_no_name指出的,LIKE
不支持正则表达式。我应该使用 SIMILAR TO
.
我将创建一个 table person
,其中包含两者共有的所有属性,包括用于标识教师和学生的 type
列。然后,您可以在 phone 和电子邮件列上创建唯一约束(或索引)。
要存储“类型特定”属性(毕业年份、系),您可以在 person
table 中包含可为空的列,并且只根据类型输入值。如果您不希望除这两个之外还有更多“特定于类型”的属性,这可能是最简单的解决方案
如果您需要更多“特定于类型”的属性,还可以使用包含这些属性的附加 tables(student
和 teacher
)。这是在关系数据库中建模继承的传统方式。由于 Postgres 支持 table 继承,您还可以创建 teacher
和 student
table 继承自 person
table.
我创建了以下两个 tables 来映射学生和教师:
CREATE TABLE students(
student_id SERIAL PRIMARY KEY,
first_name NOT NULL VARCHAR(50),
last_name NOT NULL VARCHAR(50),
phone VARCHAR(15) UNIQUE NOT NULL CHECK (phone NOT LIKE '%[^0-9]%'),
email VARCHAR(30) UNIQUE NOT NULL CHECK (email NOT LIKE '%@%'),
graduationYear SMALLINT CHECK (graduationYear > 1900)
);
CREATE TABLE teachers(
teacher_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
departament VARCHAR(40) NOT NULL,
email VARCHAR(30) UNIQUE NOT NULL CHECK (email NOT LIKE '%@%'),
phone VARCHAR(15) UNIQUE NOT NULL CHECK (phone NOT LIKE '%[^0-9]%')
);
如您所见,两个 table 都有 phone
和 email
的列。我希望这两个对每个人来说都是 独一无二的。
我如何引入一个约束来检查引入的 phone number/email,例如,在 students
table 中是否已经存在teachers
table?
是否有任何类型的关键字像 UNIQUE 一样工作但在多个 table 上,还是我应该采用另一种方法?
编辑:正如@a_horse_with_no_name指出的,LIKE
不支持正则表达式。我应该使用 SIMILAR TO
.
我将创建一个 table person
,其中包含两者共有的所有属性,包括用于标识教师和学生的 type
列。然后,您可以在 phone 和电子邮件列上创建唯一约束(或索引)。
要存储“类型特定”属性(毕业年份、系),您可以在 person
table 中包含可为空的列,并且只根据类型输入值。如果您不希望除这两个之外还有更多“特定于类型”的属性,这可能是最简单的解决方案
如果您需要更多“特定于类型”的属性,还可以使用包含这些属性的附加 tables(student
和 teacher
)。这是在关系数据库中建模继承的传统方式。由于 Postgres 支持 table 继承,您还可以创建 teacher
和 student
table 继承自 person
table.