2012-09-03 52 views
2

只是尋找一些提示和指針,我正在做一個小項目。我有一些想法,但我不確定他們是否是最佳做法。我正在使用mysql和php。在事務中插入mysql外鍵和主鍵。

我在數據庫中有一個名爲nomsing的表。

它有一個主鍵叫行ID是一個整數。

然後我有大約8個其他表引用此表。 這就是所謂的nomplu,accsing,accplu,datsing,datplu等。 每個都有一個引用nomsing主鍵的列。

Withing my php code I have all the information to insert into the tables except one thing,the row id primary key of the nomsing table。所以php會產生一系列如下所示的插入。

INSERT INTO nomsing(word,postress,gender) VALUES (''велосипед","8","mask"). 
INSERT INTO nomplu(word,postress,NOMSING?REFERENCE) VALUES (''велосипеды","2",@the reference to the id of the first [email protected]). 

還有更多的插入,但這一個得到了重點。第二個插入應該引用第一個插入的自動生成的ID。我這是作爲一個事務工作,所以所有的插入應該完成或沒有。

我的一個想法是不自動生成id並在php中自己生成它。這種方式會知道在交易之前給出的id,但是我必須檢查id是否已經在db中。

我的另一個想法是做第一次插入,然後在php中查詢該插入的行ID,然後進行第二次插入。我的意思是兩者都應該工作,但他們似乎不是最佳解決方案。我對數據庫事務特性不太熟悉,但在這種情況下,最好的方法是什麼。我不喜歡插入然後查詢id然後運行其餘查詢的想法。看起來效率很低,或者我錯了。

+0

檢查此:http://stackoverflow.com/questions/621369/sql-insert-and-catch-the-id-auto-increment-value – mostruash

+0

在交易中'new.PK_field_name_in_inserted_table'將返回最後插入的id爲當前會話。所以你可以在手動創建的事務中使用它。我不知道這是你想要的,但希望它有幫助。順便說一句,您的查詢中有語法錯誤。 – Leri

+0

看起來非常好。謝謝。你知道這個mysql_insert_id函數是否是線程安全的。我的意思是如果一個用戶在一秒鐘之後再次調用插入,然後再調用另一個。然後,當第一個用戶調用獲取ID時,它將從第二個用戶獲得插入的ID。 – KennyBartMan

回答

1

只需在主表中插入一行即可。然後,您可以在PDO上獲取insert idlastInserId)並使用它填充其他查詢。

+0

我有點小菜。什麼是PDO? – KennyBartMan

+0

在PHP上,有3種常見的訪問MySQL數據的方式:mysql(不建議使用)mysqli和PDO。 PDO是您最喜愛的新項目選擇。 – JvdBerg

+0

這看起來可能是正確的答案。 – KennyBartMan

0

您可以使用由JvdBerg或Mysql的LAST_INSERT_ID給出的php版本。我通常使用前一個選項。

查看相似的問題here

0

您可以向nomsing表中添加一個名爲'insert_order'(或類似的)的默認值爲0的新列,然後不是爲每個插入生成一個SQL語句,而是創建一個批量插入語句,例如

INSERT INTO nomsing(word,postress,gender, insert_order) 
VALUES (''велосипед","8","mask",1), (''abcd'',"9","hat",2)..... 

你生成insert_order數量與在循環的計數器從1開始。然後,您可以在桌子上執行一個SELECT以獲取id

SELECT row_id 
FROM nomsing 
WHERE insert_order > 0; 

現在您已擁有所有ID,您現在可以爲以下查詢執行批量插入操作。在腳本的結束只是一個更新insert_order列重置爲0

UPDATE nomsing SET insert_order = 0 WHERE insert_order > 0; 

它可能看起來凌亂增加一個額外的列要做到這一點,但它會隨着在執行一個查詢添加一個顯著的速度增加一次。