如何在多个表之间实施唯一约束?

问题描述

我创建了以下两个表格来列出学生和老师的情况:

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,phone VARCHAR(15) UNIQUE NOT NULL CHECK (phone NOT LIKE '%[^0-9]%')
);

如您所见,两个表都有一个列,分别用于phoneemail。我希望这两个对每个人都是唯一

如何引入约束来检查students表中是否不存在例如在teachers表中引入的电话号码/电子邮件? 有没有可以像UNIQUE那样在多个表上使用的关键字,还是应该采用另一种方法

编辑:正如@a​​_horse_with_no_name指出的那样,LIKE不支持正则表达式。我应该使用SIMILAR TO

解决方法

我将创建一个单独的表person,该表包含所有共同的属性,包括标识教师和学生的type列。然后,您可以在电话和电子邮件列上创建唯一的约束(或索引)。

要存储“特定于类型”的属性(毕业年份,部门),您可以在person表中具有可空列,并且只能根据类型放入值。如果您不希望除了这两个属性之外还拥有更多“特定于类型”的属性,那么这可能是最简单的解决方案

如果您期望更多“特定于类型”的属性,则也可以使用包含这些属性的其他表(studentteacher)。这是在关系数据库中建模继承的传统方法。由于Postgres支持表继承,因此您还可以创建teacherstudent表以从person表继承。