mysql创建数据库表查询

fbcarpbf  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(390)

我想在两个或多个表之间创建一个联接表。
table是学生的,当然是。
将注册联接表。
商业规则是一个学生一次只能参加一门课程。
我要阻止用户在课程中注册1次后创建其他注册。
我不知道这将是什么类型的禁忌,或者它是否可能。
有人能帮忙吗?
谢谢您
注意:我不认为可以创建一个主键作为另一个表的主键,即student表的studentid。如果可以,我会的。我想是违反了规则。这将是一个外键,它不是唯一的。
如果业务规则应该被忽略,并且假设一个学生一次自然只参加一门课程。。也许我会停止担心。。。

py49o6xq

py49o6xq1#

每个表可以有一个主键。两个表可以定义相同的主键(但是实现取决于实体关系模型,我们对实体和实体之间关系的发现。
根据问题中提供的信息,注册表的可能实现:

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 ,定义为数据类型 INT UNSIGNED 在本例中,主键约束对 (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
)

llmtgqce

llmtgqce2#

可以在联接表中创建唯一索引。
在上创建唯一索引名称 your_join_table (学生ID);

vyswwuz2

vyswwuz23#

你可以为id\u学生创建一个唯一的索引,但是如果学生以后尝试注册其他课程,这会带来问题。您应该将id\u过程包含到unique约束中。 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;

结束$$`

相关问题