ROB*_*ail 1 sql postgresql database-design constraints unique-constraint
我创建了以下两个表来绘制学生和教师的地图:
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]%')
);
Run Code Online (Sandbox Code Playgroud)
如您所见,两个表都有一列用于phone和email。我希望这两个对每个人都是独一无二的。
我如何引入约束来检查例如students表中引入的电话号码/电子邮件是否已存在于teachers表中?是否有任何类型的关键字可以像 UNIQUE 一样在多个表上使用,还是应该采用另一种方法?
编辑:正如@a_horse_with_no_name 指出的那样,LIKE不支持正则表达式。我应该使用SIMILAR TO.
我将创建一个person包含所有属性的单个表,这些属性是两者共有的type,包括一个标识教师和学生的列。然后您可以在电话和电子邮件列上创建唯一约束(或索引)。
要存储“类型特定”属性(毕业年份、部门),您可以在person表中包含可为空的列,并且仅根据类型输入值。如果您不希望除了这两个属性之外还有更多“特定于类型”的属性,这可能是最简单的解决方案
如果您期望更多“特定于类型”的属性,也可以使用包含这些属性的附加表(student和teacher)。这是在关系数据库中建模继承的传统方法。由于 Postgres 支持表继承,您还可以创建teacher和student表以从person表继承。
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |