MySQL 创建数据库 table 查询

MySQL creating a database table query

我想在两个或多个 table 之间创建连接 table。

table 是学生和课程。

加入 table 将被注册。

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

我想阻止用户在课程中进行 1 次注册后创建额外的注册。

我不确定这将是什么类型的限制,或者是否可能。

有人能帮忙吗?

谢谢

注意:我认为不可能将主键创建为另一个 table 的主键,即学生 table 的 studentID。如果可以的话我会的。打破了我认为的规则。这将是一个不唯一的外键。

如果应该忽略业务规则,并假设学生自然会一次只注册一门课程..也许我就不用担心了...

您可以在联接中创建唯一索引 table。

CREATE UNIQUE INDEX index_name ON your_join_table (studentId);

每个table可以有一个主键。两个 table 可以定义相同的主键。 (但实现取决于实体关系模型,即我们发现的关于实体和实体之间关系的内容。

根据问题中提供的信息,可能实施注册 table:

 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
 )

外键列的数据类型必须与引用列的数据类型相匹配;在这个例子中,我假定 studentcourse 中的主键列 id,定义为数据类型 INT UNSIGNED

在此示例中,PRIMARY KEY 约束对 (student_id,course_id) 的组合强制执行唯一约束。尝试插入第二个注册(同一课程中的同一学生)将是一个重复的行,并且会引发约束冲突,从而阻止添加该行。

如果 enrollment 结果是模型中的一个实体,具有自己的属性,我会选择添加一个单独的 id 列作为代理主键,具有唯一约束在 (student_id,course_id)

 CREATE TABLE current_enrollment
 ( id            INT UNSIGNED NOT NULL COMMENT 'pk'
 , student_id    INT UNSIGNED NOT NULL COMMENT 'fk ref student.id'
 , course_id     INT UNSIGNED NOT NULL COMMENT 'fk ref course.id'
 , enrollment_dt   DATETIME 
 , status          VARCHAR(8)
 , approval_by     VARCHAR(8)
 , PRIMARY KEY (id)

 , CONSTRAINT current_enrollment_UX1 UNIQUE 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 创建唯一索引,但如果学生稍后尝试注册其他课程,这可能会带来问题。您应该将 id_course 包含在唯一约束中。

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(studentId, course_id)

其他解决方案可能是创建触发器。

触发器应该是 "before insert" 触发器。这个应该在table中搜索与学生相关的信息,如果table没有信息则插入信息,否则什么都不做。

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;

结束; $$`