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

时间:2014-06-17 10:37:51

标签: php mysql

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

  1. 表类 - 所有类的详细信息。主键类ID
  2. 表格学生 - 所有学生的详细信息,主要学生ID。外键ClassID
  3. 表学期 - 所有学期的详细信息,关键的SemesterID
  4. 表类 - 学期。该表解决了许多关系,类和学期的主键ID。外键ClassID,SemesterID
  5. 表主题 - 所有主题的详细信息,主题ID
  6. 表类 - 主题。该表解决了许多关系,类和学期的主键ID。外键ClassID,SubjectID
  7. 表格标记 - 包括学生ID,主题ID,学期ID,成就标记。外键IDID,SemesterID,SubjectID
  8. 我还在所有引用父表的表中应用了外键。我希望在我的数据库中应用完整性,以便将特定班级的学生自动分配给该特定班级的科目。

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

    我确信这可以使用外键约束来完成。但是,我这样做有点天真。一个工作的例子非常受欢迎

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

1 个答案:

答案 0 :(得分:1)

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

MySQL 5.1: CREATE TABLE

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

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

以下是联系统计信息的子表中的示例(... atte ...),该子表链接到联系人(人)父表。

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以使它们与父母保持一致(我暂时没有研究参照完整性,但我认为这是怎么回事!Dang that MS Access!如果我错了,请不要投票给我。只需评论,我就可以解决问题。:-))。最好的办法是确保您了解参考完整性如何适用于当前的情况。说实话,我忘了ON UPDATE位是如何工作的,因为我有一段时间没用过它。 : - )

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

MySQL 5.1: CREATE TRIGGER

这应该让你去。我试过了! : - )

安东尼