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