2015-04-03 88 views
0

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

不能添加或更新子行,外键约束失败(thedatabasetblC,约束tblC_ibfk_1外键(ID)引用。 tblAID)ON DELETE NO 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

尝试发布一些代码以及错误消息。你在使用实体框架吗?它是一个网络应用程序? – 2015-04-03 22:29:14

+0

不是一个Web应用程序,只是一个普通的C#应用​​程序。数据库是为了以后与本地web应用程序共享(mysql的原因)。 – Beaker 2015-04-03 23:06:05

+0

您是否尝试过手动运行sql? – 2015-04-04 07:46:19

回答

1

您的语法正常,但外键错误指示数据问题。

由于被引用的ID在tblA中不存在,所以发生错误。

所以,如果你正在做的事情,如:

INSERT INTO tblC SET tblA_id = 100, tblB_id = 101

TBLA必须有一个ID = 100的记录,并TBLB必须与ID = 101或将出现一个外键错误的记录。

1

必须添加外部记录第一个;对所有插入使用事务以确保一致性。

这是因为MySQL does not support deferred FK constraints,但后来同样没有SQL服务器..

Like MySQL in general, in an SQL statement that inserts, deletes, or updates many rows, InnoDB checks UNIQUE and FOREIGN KEY constraints row-by-row. When performing foreign key checks, InnoDB sets shared row-level locks on child or parent records it has to look at. InnoDB checks foreign key constraints immediately; the check is not deferred to transaction commit. ..

(此外,代孕/自动递增的PK,怎么能不存在一个访问标识了吗?)

插入这样的关系可以用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; 

完全相同的Appro公司从客户端进行插入时,必须遵循ach。创建外部记录;获取ID,使用从属记录中的ID。

对于“通用”ADO.NET解决方案,可以使用ExecuteScalar的结果插入along with a trailing select(因数据库而异)。如果从MySqlConnector使用MySqlCommand,则此is natively supported via LastInsertedId

使用其他框架和/或ORM时,请遵循其中用于构建对象图和/或确定插入ID的规则。