【问题标题】:mysql RDBMS, applying foreign key constraints in many tablesmysql RDBMS,在许多表中应用外键约束
【发布时间】:2014-08-07 08:04:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 表的存储引擎是什么?默认情况下,一些 MySQL 安装使用 MyISAM 作为默认存储引擎,并且它支持外键约束。您至少需要使用 InnoDB 存储引擎。
  • 嗨 Anthony,引擎 = InnoDB AUTO_INCREMENT = 53 默认字符集 = utf8;
  • 您可能需要一个触发器“以便特定班级的学生将自动分配到该特定班级的科目。”换句话说,您可能需要在另一个表中创建记录的基础上,在一个表中创建一条记录,对吧?

标签: php mysql


【解决方案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

这是一个来自联系人统计子表的示例 (...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: CREATE TRIGGER

这应该会让你继续前进。我试过了! :-)

安东尼

【讨论】:

  • 在最后一行中您提到“确保您不需要触发器”
猜你喜欢
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多