【问题标题】:MySQL creating a database table queryMySQL 创建数据库表查询
【发布时间】:2018-12-12 04:47:56
【问题描述】:

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

表格是学生和课程。

将注册加入表。

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

我想阻止用户在完成 1 次课程注册后创建其他注册。

我不确定这将是什么类型的约束,或者它是否可能。

有人可以帮忙吗?

谢谢

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

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

【问题讨论】:

  • 您可以在student 中添加一个字段,称为current_course_id,引用course

标签: mysql database relational


【解决方案1】:

您可以为 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;

结束; $$`

【讨论】:

    【解决方案2】:

    您可以在连接表中创建唯一索引。

    创建唯一索引 index_name 开your_join_table (studentId);

    【讨论】:

      【解决方案3】:

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

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

       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
       )
      

      【讨论】:

        猜你喜欢
        • 2014-12-31
        • 2012-11-13
        • 1970-01-01
        • 2011-04-29
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多