我想在两个或多个表之间创建一个联接表。
表是学生和课程。
加入表格将被注册。
业务规则是,学生一次只能注册一门课程。
我要阻止用户在课程中注册1次后创建其他注册。
我不确定这是什么类型的约束,或者甚至可能。
有人可以帮忙吗?
谢谢
注意:我认为不可能创建主键作为另一个表的主键,即学生表的studentID。如果可以的话。违反了我的想法。这将是一个不唯一的外键。
如果应该忽略业务规则,并假设一个学生自然只会一次选修一门课程..也许您会不担心...
答案 0 :(得分:0)
您可以在联接表中创建唯一索引。
创建唯一索引index_name 开启
your_join_table
(studentId);
答案 1 :(得分:0)
每个表可以有一个主键。两个表可以定义相同的主键。 (但是实现方式取决于实体关系模型,即我们发现的有关实体以及实体之间关系的信息。
根据问题中提供的信息,可能实现注册表格:
$reasons
外键列的数据类型必须与引用列的数据类型匹配;在此示例中,我假设 CREATE TABLE current_enrollment
( student_id INT UNSIGNED NOT NULL COMMENT 'pk, fk ref student.id'
, course_id INT UNSIGNED NOT NULL COMMENT 'pk, fk ref course.id'
, PRIMARY KEY (student_id, course_id)
, CONSTRAINT FK_currrent_enrollment_student FOREIGN KEY ( student_id )
REFERENCES student (id) ON UPDATE CASCADE ON DELETE RESTRICT
, CONSTRAINT FK_currrent_enrollment_course FOREIGN KEY ( course_id )
REFERENCES course (id) ON UPDATE CASCADE ON DELETE RESTRICT
)
和id
中的主键列student
被定义为数据类型course
在此示例中,PRIMARY KEY约束对INT UNSIGNED
的组合实施了唯一约束。尝试插入第二个注册(同一课程的同一位学生)将是重复的行,并且将引发约束冲突,从而阻止添加行。
如果(student_id,course_id)
最终成为模型中的一个实体,具有自己的属性,我将选择添加一个单独的enrollment
列作为代理主键,并且对{ {1}}
id
答案 2 :(得分:0)
您可以为id_student创建一个唯一索引,但是如果学生以后尝试注册其他课程,这显然会带来问题。您应该将id_course包含在唯一约束中。
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(studentId, course_id)
其他解决方案可能是创建触发器。
触发器应为“插入前”触发器。这应该在表中查询与学生有关的信息,如果表中没有信息,则插入信息,否则什么也不做。
CREATE TRIGGER 'ONE_STUDENT_PER_COURSE'
BEFORE INSERT ON 'Enrollments'
FOR EACH ROW
BEGIN
DECLARE student_id INT;
SELECT n.id_student INTO student_id
FROM table_enrollments n
`IF student_id IS NULL THEN
/* I DON´T REALLY KNOW EXACTLY THE SINTAXIS FOR INSERTING DATA OF THE BEFORE INSERT FOR YOU VERSION OF MYSQL
BUT TRY THIS ONE
*/
INSERT INTO table_enrollments (student_id, course_id) SELECT student_id, course_id FROM inserted
END IF;
END; $$`