我试图将两个表链接到一个参考表中,所以我拿了学生和程序的主键并将它们放在表classStudent中,这样我就可以将学生与程序联系起来,但我不断收到错误:
无法添加或更新子行:外键约束 失败(
CRSDB
。classStudent
,CONSTRAINTclassStudent_ibfk_1
FOREIGN KEY(programs_ID
)REFERENCEprograms
(ID
)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;
答案 0 :(得分:0)
为了向classStudent
表添加值,您必须在students
和programs
表中都有有效记录。
如果您的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();
}
}