【问题标题】:ASP.NET: Cannot add or update child row: a foreign key constraint failsASP.NET:无法添加或更新子行:外键约束失败
【发布时间】:2015-02-16 10:16:40
【问题描述】:

我在 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 替换last_insert_id(),但也没有用。我尝试直接在数据库中执行查询,它工作正常。

【问题讨论】:

  • 什么是分贝?是否有某种自定义类会在您每次调用时打开和关闭连接?

标签: c# mysql foreign-keys constraints


【解决方案1】:

代码中存在 Sql 注入问题的一部分,此行为的一个可能原因是 db 变量。如果此变量是每次调用 ExecuteXXX 方法时打开和关闭连接的自定义类的某个实例,那么您可能会遇到与在第一个表中插入值的连接不同的连接中调用的 SELECT LAST_INSERT_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() 的返回被有效地设置为当前的插入命令。

【讨论】:

    猜你喜欢
    • 2020-10-04
    相关资源
    最近更新 更多