繁体   English   中英

如何跨多个表强制执行唯一约束?

[英]How to enforce a unique constraint across multiple 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]%')
);

如您所见,两个表都有一个用于phoneemail的列。 我希望这两个对每个人都是独一无二的

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM