簡體   English   中英

ASP.NET:無法添加或更新子行:外鍵約束失敗

[英]ASP.NET: Cannot add or update child row: a foreign key constraint fails

我在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() ,但也沒有用。 我嘗試直接將查詢執行到數據庫中,並且工作正常。

代碼中存在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()的返回值有效地設置為當前的插入命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM