C# ASP.NET:无法添加或更新子行:外键约束失败

C# ASP.NET:无法添加或更新子行:外键约束失败,c#,mysql,foreign-keys,constraints,C#,Mysql,Foreign Keys,Constraints,我在asp.net应用程序中遇到了一个奇怪的问题。我有两个表,它们保存了一些变量更改的历史记录,一个表的外键指向另一个表,但出于某种原因,mysql在插入第二个表时抛出错误 Cannot add or update a child row: a foreign key constraint fails (`FlowDB/tab_hist_vars_reas`, CONSTRAINT `tab_hist_vars_reas_ibfk_1` FOREIGN KEY (`HIST_REASIG_ID`

我在asp.net应用程序中遇到了一个奇怪的问题。我有两个表,它们保存了一些变量更改的历史记录,一个表的外键指向另一个表,但出于某种原因,mysql在插入第二个表时抛出错误

Cannot add or update a child row: a foreign key constraint fails (`FlowDB/tab_hist_vars_reas`, CONSTRAINT `tab_hist_vars_reas_ibfk_1` FOREIGN KEY (`HIST_REASIG_ID`) REFERENCES `tab_hist_reas` (`HIST_REASIG_ID`))
这是在两个表中插入的代码(假设局部变量有值)。我在本地进行了测试,但当我在生产环境中安装站点时,它会抛出上述错误

string strcmd = "INSERT INTO tab_hist_reas (HIST_REASIG_INC,HIST_REASIG_FLOW,HIST_REASIG_STEP,HIST_REASIG_DATE,HIST_REASIG_USER)";
strcmd += string.Format("VALUES ({0}, '{1}', '{2}', NOW(), '{3}');", incident, flow, step, user);
db.executeNonQuery(strcmd);

strcmd = "SELECT last_insert_id() AS id";
int idHistory = (int)db.ExecuteScalar(strcmd);

foreach(var variable in lstVariables)
{
    string strcmd = "INSERT INTO tab_hist_vars_reas (HIST_REASIG_ID,HIST_VAR_REASIG_VAR,HIST_VAR_REASIG_VALUE)";
    strcmd += string.Format("VALUES ({0}, '{1}', '{2}');", idHistory, variable.Name, variable.Value);
    db.executeNonQuery(strcmd);
}
以下是表格定义

CREATE TABLE `tab_hist_reas` (
`HIST_REASIG_ID` int(11) NOT NULL auto_increment,
`HIST_REASIG_INC` int(11) default NULL,
`HIST_REASIG_FLOW` varchar(150) default NULL,
`HIST_REASIG_STEP` varchar(150) default NULL,
`HIST_REASIG_DATE` datetime default NULL,
`HIST_REASIG_USER` varchar(150) default NULL,
PRIMARY KEY  (`HIST_REASIG_ID`)
) ENGINE=InnoDB;

CREATE TABLE `tab_hist_vars_reas` (
`HIST_VAR_REASIG_ID` int(11) NOT NULL auto_increment,
`HIST_REASIG_ID` int(11) NOT NULL,
`HIST_VAR_REASIG_VAR` varchar(100) default NULL,
`HIST_VAR_REASIG_VALUE` varchar(100) default NULL,
PRIMARY KEY  (`HIST_VAR_REASIG_ID`),
KEY `IND_HIST_VAR_REAS_ID_HIST` (`HIST_REASIG_ID`),
CONSTRAINT `tab_hist_vars_reas_ibfk_1` FOREIGN KEY (`HIST_REASIG_ID`) REFERENCES `tab_hist_reas` (`HIST_REASIG_ID`)
) ENGINE=InnoDB;

我试图用
@@identity
替换上次插入的id(),但也不起作用。我尝试直接在数据库中执行查询,结果很好。

代码中存在的Sql注入问题的一部分,导致这种行为的可能原因是
db
变量。如果此变量是自定义类的某个实例,该类在每次调用ExecuteXXX方法时打开和关闭连接,则在与在第一个表中插入值的连接不同的连接中调用的
SELECT LAST\u INSERT\u ID
可能会遇到问题

您可以尝试合并两个初始命令,使它们由同一个连接一起处理

string strcmd = @"INSERT INTO tab_hist_reas 
                  (HIST_REASIG_INC,HIST_REASIG_FLOW,HIST_REASIG_STEP,
                  HIST_REASIG_DATE,HIST_REASIG_USER) ";
strcmd += string.Format("VALUES ({0}, '{1}', '{2}', NOW(), '{3}');", incident, flow, step, user);
strcmd += "SELECT last_insert_id() AS id";
int idHistory = (int)db.ExecuteScalar(strcmd);

通过这种方式,您只需执行一个命令,并且应该确保SELECT last_insert_id()的返回值有效地设置为当前insert命令。

什么是db?是某种自定义类,每次调用时都会打开和关闭连接?