我正在使用一个使用MySQL数据库的C#应用程序。我正在尝试使用2个外键插入一个表,但是收到错误:
无法添加或更新子行:外键约束失败(thedatabase
。tblC
,CONSTRAINT tblC_ibfk_1
FOREIGN KEY(ID
)参考tblA
(ID
)ON UPETE UP ACTION ON UPDATE CASCADE)
表结构是
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();
答案 0 :(得分:1)
您的语法很好但外键错误表示存在数据问题。
发生错误是因为tblA中不存在被引用的ID。
所以如果你做的事情如下:
INSERT INTO tblC SET tblA_id = 100, tblB_id = 101
tblA必须有ID = 100的记录,tblB必须有ID = 101的记录,否则会出现外键错误。
答案 1 :(得分:1)
必须先添加外国记录 ;在所有插入上使用事务以确保一致性。
这是因为MySQL does not support deferred FK constraints,但SQL Server也没有。
与MySQL一样,在插入,删除或更新许多行的SQL语句中,InnoDB逐行检查UNIQUE和FOREIGN KEY约束。执行外键检查时,InnoDB会在必须查看的子记录或父记录上设置共享行级锁。 InnoDB立即检查外键约束;检查不会延迟到事务提交。 ..
(此外,对于代理/自动增量PK,如何访问尚不存在的ID?)
插入这样的关系可以用LAST_INSERT_ID和以下SQL来说明:
BEGIN TRANSACTION;
DECLARE a_id INT DEFAULT 0,
b_id INT DEFAULT 0;
INSERT INTO tblA (..) VALUES (..)
SET a_id = LAST_INSERT_ID();
INSERT INTO tblA (..) VALUES (..)
SET b_id = LAST_INSERT_ID();
INSERT INTO tblC (..) VALUES (@a_id, @b_id, ..)
COMMIT;
从客户端进行插入时,必须遵循完全相同的方法。创建外国记录;获取ID,使用依赖记录中的ID。
对于“通用”ADO.NET解决方案,可以使用ExecuteScalar的结果作为插入along with a trailing select(因数据库而异)。如果在MySqlConnector中使用MySqlCommand
,请is natively supported via LastInsertedId
。
使用其他框架和/或ORM时,请遵循其中使用的规则来构建对象图和/或确定插入的ID。