只是尋找一些提示和指針,我正在做一個小項目。我有一些想法,但我不確定他們是否是最佳做法。我正在使用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然後運行其餘查詢的想法。看起來效率很低,或者我錯了。
檢查此:http://stackoverflow.com/questions/621369/sql-insert-and-catch-the-id-auto-increment-value – mostruash
在交易中'new.PK_field_name_in_inserted_table'將返回最後插入的id爲當前會話。所以你可以在手動創建的事務中使用它。我不知道這是你想要的,但希望它有幫助。順便說一句,您的查詢中有語法錯誤。 – Leri
看起來非常好。謝謝。你知道這個mysql_insert_id函數是否是線程安全的。我的意思是如果一個用戶在一秒鐘之後再次調用插入,然後再調用另一個。然後,當第一個用戶調用獲取ID時,它將從第二個用戶獲得插入的ID。 – KennyBartMan