2014-01-21 139 views
0

我正在使用存儲過程將數據插入到兩個表中。但是,當我插入數據時,第一個表和第二個表中的總行數是不同的,所以這意味着有時它只插入第一個表中的數據,但未能將其插入到第二個表中。但是這種情況不應該發生在我的情況中,因爲兩張表的ID是相互關聯的。我怎麼解決這個問題?因此,如果發生錯誤時它將在兩個表中插入數據或者沒有表時,數據的數量在表中都是相同的。我的存儲過程如下:用於在兩個表中插入數據的存儲過程

Begin 
insert into base_table(imgPath,store,apparelType) values (imgPath,store,apparelType); 
insert into data_table(cvID,color) values 
(LAST_INSERT_ID(),color); 
END 
+0

http://stackoverflow.com/questions/13318924/how-do-i-insert-into-two-tables-all-at-once-in-a-stored-procedure –

+0

上面的存儲過程也適用於將數據插入到兩個表中,但有時它不能將數據插入到一個表中,那麼如何防止這種情況? – user1583647

回答

0

爲了確保第一查詢已成功執行,最好的辦法是在你的base_table添加標識列,然後進行以下操作;

DECLARE @LAST_INSERT_ID INT 
DECLARE @EXECUTION_OK char(1) 
SET @EXECUTION_OK = 1 

insert into base_table(imgPath,store,apparelType) values (imgPath,store,apparelType) 

SELECT @LAST_INSERT_ID = SCOPE_IDENTITY() 

insert into data_table(cvID,color) values (@LAST_INSERT_ID, color) 
GO 

If exists(Select cvID from data_table where cvID= @LAST_INSERT_ID) 
Begin 
@EXECUTION_OK = 0 
End 

SCOPE_IDENTITY:返回插入在相同的範圍的標識列的最後一個標識值。範圍是一個模塊:存儲過程,觸發器,函數或批處理。因此,如果兩個語句處於相同的存儲過程,函數或批處理中,它們在相同的範圍內。

您還可以使用mysql_affected_rows()函數來驗證查詢是否成功。

+0

如果它將數據插入到第一個表中但不能插入到第二個表中,該怎麼辦?有沒有辦法,如果發生這種情況,它不會插入到這兩個表? – user1583647

+0

根據手冊:「MS-SQL SCOPE_IDENTITY()和@@ IDENTITY在MySQL中不起作用,還有一個MySQL_Insert_ID命令也不能在存儲過程中使用 您必須使用LAST_INSERT_ID();」 - http://dev.mysql.com/doc/internals/en/stored-procedures.html –

+0

@ user1583647我編輯瞭解決方案,以便能夠檢查第二個查詢是否已正確執行。你只需要檢查'@ EXECUTION_OK' –

相關問題