gpt4 book ai didi

sql - 多对多关系表的约束 - 两个相关记录都需要引用相同的依赖记录?

转载 作者:行者123 更新时间:2023-12-02 16:56:12 25 4
gpt4 key购买 nike

共有三个实体,StudentClassDepartment。 Department 和 Student 是一对多的关系。 Department 和 Class 也是一对多的关系。 Student 和 Class 是多对多关系。

create table Department 
(
Id int primary key,
-- ...
)

create table Student
(
Id int primary key,
DepartmentId int not null references Department(Id),
-- ....
)

create table Class
(
Id int primary key,
DepartmentId int not null references Department(Id),
....
)

下表是Student和Class之间的多对多关系。现在用户可以在表中放置一对来自不同(不应该被允许)部门的学生/类(class)。除了使用触发器之外,还有其他方法可以防止它吗?

create table StudentAndClass 
(
StudentId int references Student(Id),
ClassId int references Class(Id),
-- ....
primary key (StudentId, ClassId)
)

最佳答案

您可以在没有触发器或特殊功能的情况下执行此操作。这个想法是使用外键关系。 . .通过定义一组额外的键并将 DepartmentId(冗余地)添加到联结表:

create table Students (
StudentId int primary key,
DepartmentId int not null references Department(Id),
-- ....
unique (DepartmentId, StudentId)
);

create table Classes (
ClassId int primary key,
DepartmentId int not null references Department(Id),
....
unique (DepartmentId, ClassId)
);

create table StudentClasses (
DepartmentId int references Department(DepartmentId),
StudentId int,
ClassId int,
-- ....
primary key (StudentId, ClassId),
foreign key (DepartmentId, StudentId) references (DepartmentId, StudentId),
foreign key (DepartmentId, ClassId) references (DepartmentId, ClassId),
);

您可能不想要冗余,但没有触发器或特殊功能也是可能的。

关于sql - 多对多关系表的约束 - 两个相关记录都需要引用相同的依赖记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56331719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com