C# MySQL使用2个外键插入到表中
我正在开发一个使用MySQL数据库的C#应用程序。我试图用两个外键插入一个表,但出现错误: 无法添加或更新子行:外键约束失败(C# MySQL使用2个外键插入到表中,c#,mysql,database,C#,Mysql,Database,我正在开发一个使用MySQL数据库的C#应用程序。我试图用两个外键插入一个表,但出现错误: 无法添加或更新子行:外键约束失败(thedatabasetblC,约束tblC\u ibfk\u 1外键(ID)引用tblA(ID)在删除时不执行更新级联操作) 表结构是 tblA-ID,col2,col3,col4 tblB-ID,col2,col3,col4 tblC-tblA.ID,tblB.ID,col3,col4,col5 我一直在浏览论坛,在我的一生中,我找不到使它工作的语法 这是我用来连接的
thedatabase
tblC
,约束tblC\u ibfk\u 1
外键(ID
)引用tblA
(ID
)在删除时不执行更新级联操作)
表结构是
tblA-ID,col2,col3,col4
tblB-ID,col2,col3,col4
tblC-tblA.ID,tblB.ID,col3,col4,col5
我一直在浏览论坛,在我的一生中,我找不到使它工作的语法
这是我用来连接的。我已确认父表中存在该ID
//Connect to the database
MySqlConnection connection = new MySqlConnection(connectionString);
MySqlCommand cmd;
connection.Open();
//Insert new record into database
cmd = connection.CreateCommand();
cmd.CommandText = "INSERT INTO tblC(tblA_ID, tblB_ID, col3, col4, col5) VALUES(@tblA_ID, @tblB_ID, @col3, @col4, @col5);";
cmd.Parameters.AddWithValue("@tblA_ID", tblA_ID);
cmd.Parameters.AddWithValue("@tblB_ID", tblB_ID);
cmd.Parameters.AddWithValue("@col3", col3);
cmd.Parameters.AddWithValue("@col4", col4);
cmd.Parameters.AddWithValue("@col5", col5);
cmd.ExecuteNonQuery();
connection.Close();
您的语法很好,但外键错误表明存在数据问题 发生错误是因为tblA中不存在引用的ID 因此,如果您正在执行以下操作:
插入tblC集合tblA_id=100,tblB_id=101
tblA必须有ID=100的记录,tblB必须有ID=101的记录,否则会发生外键错误。必须先添加外键记录;在所有插入中使用事务以确保一致性 这是因为MySQL,但SQL Server也不是 与一般的MySQL一样,在插入、删除或更新许多行的SQL语句中,InnoDB逐行检查唯一和外键约束。在执行外键检查时,InnoDB会对其必须查看的子记录或父记录设置共享行级锁InnoDB立即检查外键约束;检查不会延迟到事务提交 (此外,对于代理/自动增量PKs,如何访问尚不存在的ID?) 插入这种关系可以用和以下SQL进行说明:
开始交易;
声明一个_id INT默认值0,
b_id INT默认值为0;
插入tblA(..)值(..)
设置一个_id=LAST_INSERT_id();
插入tblA(..)值(..)
设置b_id=LAST_INSERT_id();
插入tblC(…)值(@a_id,@b_id,…)
犯罪
从客户端执行插入时,必须遵循完全相同的方法。创建外来记录;获取ID,使用依赖记录中的ID
对于“通用”ADO.NET解决方案,可以将ExecuteScalar的结果用于插入(因数据库而异)。如果从MySqlConnector使用MySqlCommand
,则会显示此命令
使用其他框架和/或ORM时,请遵循其中用于构建对象图和/或确定插入ID的规则。尝试发布一些代码和错误消息。您正在使用实体框架吗?它是一个web应用程序吗?不是web应用程序,只是一个普通的C#应用程序。该数据库将在以后与本地web应用程序共享(mysql的原因)。您是否尝试手动运行sql?