MySQL创建数据库表查询

时间:2018-12-11 19:49:25

标签: mysql database relational

我想在两个或多个表之间创建一个联接表。

表是学生和课程。

加入表格将被注册。

业务规则是,学生一次只能注册一门课程。

我要阻止用户在课程中注册1次后创建其他注册。

我不确定这是什么类型的约束,或者甚至可能。

有人可以帮忙吗?

谢谢

注意:我认为不可能创建主键作为另一个表的主键,即学生表的studentID。如果可以的话。违反了我的想法。这将是一个不唯一的外键。

如果应该忽略业务规则,并假设一个学生自然只会一次选修一门课程..也许您会不担心...

3 个答案:

答案 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; $$`