MySQL使用2个外键插入表中

时间:2015-04-03 22:18:44

标签: c# mysql database

我正在使用一个使用MySQL数据库的C#应用​​程序。我正在尝试使用2个外键插入一个表,但是收到错误:

无法添加或更新子行:外键约束失败(thedatabasetblC,CONSTRAINT tblC_ibfk_1 FOREIGN KEY(ID)参考tblAID)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();

2 个答案:

答案 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。