【发布时间】:2020-06-10 17:16:30
【问题描述】:
尝试在 MySQL db 中添加一些项目时,我收到以下错误:
: '无法添加或更新子行:外键约束失败 (
articoli_ordini, CONSTRAINTfk_articoli_ordini_ordini1FOREIGN KEY (ID_OR_ART) REFERENCESordini(ID_OR) ON DELETE CASCADE ON UPDATE CASCADE) '
似乎通过LAST_INSERT_ID() 找不到我应该添加到INSERT 查询的外键,但列表的第一项已成功添加,而下一项失败。
我要添加项目的 MySQL 表是 3,Ordini 假设它是父表,Articoli_Ordini 在 ID 为 Ordini 和 Varianti_Articoli 上有外键,它指的是 Articoli_Ordini 所以有id 为 Articoli_Ordini 的外键。
我执行所有 INSERT 的方法如下所示:
var query_ordine = @"INSERT INTO `ordini` (`TIPO_OR`, `ORA_OR`, `SENT_OR`, `ID_OR_CFG`) VALUES (@tipo, NOW(), 0, @cfg);";
using var connection = new MySqlConnection(connectionString);
connection.Open();
using var cmd = new MySqlCommand(query_ordine, connection);
cmd.Parameters.AddWithValue("@tipo", carrello.tipo);
cmd.Parameters.AddWithValue("@cfg", cfg);
cmd.Parameters.AddWithValue("@id", 0);
cmd.Parameters.AddWithValue("@qta", 0);
cmd.Prepare();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
return new StatusCodeResult(500);
}
foreach (var articolo in carrello.articoli)
{
var query_articolo = @"INSERT INTO `articoli_ordini` (`TIPO_ART`, `COD_ART`, `QTA_ART`, `ID_OR_ART`) VALUES (@tipo, (SELECT CODICE_PRP FROM vo_plurep WHERE ID_PLUREP = @id), @qta, LAST_INSERT_ID());";
cmd.CommandText = query_articolo;
cmd.Parameters["@tipo"].Value = articolo.tipo;
cmd.Parameters["@id"].Value = articolo.id;
cmd.Parameters["@qta"].Value = articolo.qta;
cmd.ExecuteNonQuery();
foreach(var variante in articolo.varianti)
{
var query_variante = @"INSERT INTO `varianti_articoli` (`COD_VAR`, `ID_ART_VAR`) VALUES ((SELECT CODICE_VAR FROM vo_varianti WHERE ID_VARIANTI = @id), LAST_INSERT_ID());";
cmd.CommandText = query_variante;
cmd.Parameters["@id"].Value = variante.id;
cmd.ExecuteNonQuery();
}
}
并且在foreach (var articolo in carrello.articoli)的第二个循环中失败
我应该先将LAST_INSERT_ID() 存储为Articoli_Ordini 甚至Varianti_Articoli 并使用它而不是直接插入LAST_INSERT_ID()?
【问题讨论】:
-
您将存储父级的
LAST_INSERT_ID。第二次迭代使用子查询的LAST_INSERT_ID。