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
)
外键列的数据类型必须与引用列的数据类型相匹配;在这个例子中,我假定 student
和 course
中的主键列 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;
结束; $$`
我想在两个或多个 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
)
外键列的数据类型必须与引用列的数据类型相匹配;在这个例子中,我假定 student
和 course
中的主键列 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;
结束; $$`