2015-04-03 83 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的規則。