通过外键将两个表连接在一起

时间:2015-06-03 19:34:11

标签: mysql

我试图将两个表链接到一个参考表中,所以我拿了学生和程序的主键并将它们放在表classStudent中,这样我就可以将学生与程序联系起来,但我不断收到错误:

  

无法添加或更新子行:外键约束   失败(CRSDBclassStudent,CONSTRAINT classStudent_ibfk_1 FOREIGN   KEY(programs_ID)REFERENCE programsID)ON DELETE NO ACTION ON   更新无行动)。

请提出任何建议,我们将不胜感激。

CREATE TABLE IF NOT EXISTS `CRSDB`.`students` (
  `ID` DECIMAL(10,0) NULL DEFAULT NULL,
  `Name` TEXT NULL DEFAULT NULL,

  PRIMARY KEY (`ID`))
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `CRSDB`.`programs` (
  `ID` INT NULL AUTO_INCREMENT,
  `Name` TEXT NULL,
  PRIMARY KEY (`ID`))
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `CRSDB`.`classStudent` (
  `ID` INT NOT NULL AUTO_INCREMENT,
  `class_ID` INT NULL,
  `programs_ID` INT NOT NULL,
  `students_ID` DECIMAL(10,0) NOT NULL,
  PRIMARY KEY (`ID`),
  INDEX `fk_classStudent_programs1_idx` (`programs_ID` ASC),
  INDEX `fk_classStudent_students1_idx` (`students_ID` ASC),
  CONSTRAINT `fk_classStudent_programs`
    FOREIGN KEY (`programs_ID`)
    REFERENCES `CRSDB`.`programs` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_classStudent_students`
    FOREIGN KEY (`students_ID`)
    REFERENCES `CRSDB`.`students` (`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

2 个答案:

答案 0 :(得分:0)

为了向classStudent表添加值,您必须在studentsprograms表中都有有效记录。

如果您的students表格如下:

ID     Name
----  ----------
1      George
2      Samuel

你的programs表看起来像这样

ID     Name
----  ----------
1      History
2      Science

您只能向classStudent表添加与外键字段ID相匹配的值:

ID     class_ID   programs_ID   students_ID
----  ---------- ------------- -------------
1      ?          1             1
2      ?          1             2
3      ?          2             1
4      ?          2             3   <====WILL FAIL

我不知道class_ID字段应该是什么,但我没有看到它的约束。

由于这些列值取决于其他表值,因此无法添加不存在的值。

答案 1 :(得分:0)

也许这不是解决此问题的最有效或最安全的方法,但对我有用的是创建一个小方法来将外键检查设置为0,并在插入信息后将其设置为1.我希望这可以帮助别人。 此代码位于c#:

public void disableCHECK()
{
 conexion.Open();
 if (this.OpenConnection() == true)
  {
   string query = "SET FOREIGN_KEY_CHECKS = 0";
   MySqlCommand cmd = new MySqlCommand(query, con);
   cmd.ExecuteNonQuery();
   this.CloseConnection();
  }
}