繁体   English   中英

mysql RDBMS,在许多表中应用外键约束

[英]mysql RDBMS, applying foreign key constraints in many tables

您好朋友,我正在基于php mysql的学校数据库系统上工作。 基本结构如下:

  1. 表类-所有类的详细信息。 主键类别ID
  2. 表学生-所有学生的详细信息,主键StudentID。 外键ClassID
  3. 表学期-所有学期的详细信息,关键SemesterID
  4. 表类-学期。 该表解决了班级和学期的多对多关系,主键ID。 外键ClassID,SemesterID
  5. 表格主题-所有主题的详细信息,关键SubjectID
  6. 表类-主题。 该表解决了班级和学期的多对多关系,主键ID。 外键ClassID,SubjectID
  7. 表标记-由学生ID,科目ID,学期ID,已取得的分数组成。外键类别ID,学期ID,科目ID

我还在引用父表的所有表中应用了外键。 我希望在数据库中应用完整性,以便将特定班级的学生自动分配给该特定班级的科目。

如果我们尝试更改学生的学科,则数据库应该抛出错误,这些学科属于该学生所属的班级。

我确信可以使用外键约束来做到这一点。 但是,我有点天真。 一个工作示例受到高度赞赏

ENGINE = InnoDB
AUTO_INCREMENT = 53
DEFAULT CHARACTER SET = utf8;

好的,我会尽力的。 :-)首先,使用MySQL手册来创建表,以确保您完全了解语法。

MySQL 5.1:创建表

查找看起来像这样的部分。

reference_definition:

REFERENCES tbl_name (index_col_name,...)
  [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
  [ON DELETE reference_option]    <----
  [ON UPDATE reference_option]    <----

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

以下是联系统计信息的子表(链接到联系人(人)父表)的一个示例(... attept ...)。

CREATE TABLE IF NOT EXISTS contactStats_tbl(
id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Contact ID number.',
email VARCHAR(254) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT 'E-mail address from contacts_tbl.',
subscribeTime TIMESTAMP DEFAULT '0000-00-00 00:00:00' COMMENT 'Time of subscription.',
unsubscribeTime TIMESTAMP DEFAULT '0000-00-00 00:00:00' COMMENT 'Time of unsubscription.',
totalMessages INT(4) NOT NULL COMMENT 'Number of messages sent.',
newsLetter ENUM('Y', 'N') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N' COMMENT 'Newsletter subscription.',
CONSTRAINT csconstr01 FOREIGN KEY (id, email) REFERENCES contacts_db.contacts_tbl(id, email) ON UPDATE CASCADE ON DELETE RESTRICT)
ENGINE=InnoDB DEFAULT CHARACTER SET = utf8 COMMENT 'Contact statistics table.';

本质上,由于表约束,您将重点放在某人试图DELETEUPDATE包含指向父表(在本例中为外键)的字段的子表中的记录的时间。 对于所有子表,我的建议是将ON DELETE选项设置为RESTRICT (默认值)。 但是,对于ON UPDATE ,子表应该应该进行CASCADE以使其与父母保持一致(我已经有一段时间没有研究参照完整性了,但是我想是这样的!MS Access!当我拒绝我!是错误的,请发表评论,我会修复我的答案。:-))。 最好的办法是确保您知道引用完整性如何应用于当前情况。 说实话,我忘记了ON UPDATE位的工作原理,因为我有一段时间没有使用它了。 :-)

现在,至于基于将记录主动插入到其他表(主表)中来自动将字段值插入到记录(辅助表中)中,请确保您不需要触发器。

MySQL 5.1:创建触发器

这应该可以帮助您。 我试过了! :-)

安东尼

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM