2016-06-13 39 views
-3

我在MYSQL中有2個具有相似列的表。我用INSERT INTO table2 SELECT * FROM table1 WHERE column1=smth將數據從一個拷貝到另一個。我有不同的列作爲autoincrement和KEY在表中。當我使用mysqli_insert_id時,我得到的是第一個,而不是最後一個插入的。有沒有辦法得到最後一個?INSERT INTO表SELECT沒有給出正確的last_id

謝謝

+0

如果您不分享有關您的數據庫結構,示例數據和PHP代碼的任何信息,則無法回答。乍一看,你根本不應該得到任何AUTO_INCREMENT,因爲你沒有留下任何空白欄,但當然這只是一個猜測。 –

+0

mysqli_insert_id()反正只會給你一個id值。無法從多記錄插入中獲取ID。如果你需要這個ID,那麼每一個插入單個/單個插入和last_insert_id()。 –

回答

2

關係數據庫中沒有數據的繼承順序。您必須指定是哪個字段您希望通過像訂購:

INSERT INTO table2 
SELECT * 
FROM table1 
WHERE column1=smth 
ORDER BY <field to sort by here> 
LIMIT 1; 

依託一個記錄寫入到一個表是一個非常糟糕的主意的順序。如果在table1上有一個自動編號的id,那麼只需使用ORDER BY id DESC LIMIT 1按ID降序排列結果集並選擇最後一個。


更新,以解決OP的問題有關mysqli_insert_id

據MySQL參考這裏調用的函數是last_insert_id()它指出:

重要如果您插入使用一個INSERT語句多行, LAST_INSERT_ID()返回針對第一插入 僅行生成的值。這樣做的原因是可以輕鬆地再現 針對其他服務器的相同INSERT語句。

不幸的是,你必須做第二次查詢才能得到真正的「最後插入的ID」。你最好的辦法可能是運行一個SELECT COUNT(*) FROM table1 WHERE column1=smth;,然後用count(*)返回來增加mysqli_insert_id的值。這並不是很好,但如果你的這個功能受到很大打擊,那麼這可能是最安全的路線。

不太安全的路線是SELECT max(id) FROM table2SELECT max(id) FROM table2 Where column1=smth。但是......再次,取決於你的鑰匙和插入次數的增加,這可能是有風險的。

+0

對不起,我想我不是很清楚。問題是SELECT位返回一些記錄,當這些記錄被添加到table2中時,mysqli_insert_id返回第一個自動識別的ID。所以,如果讓我們說,從表1中選擇3個記錄,將它們插入到表2和爲他們創造的ID 4,5,6 - mysqli_insert_id將返回4,而不是6 – user3195616

+0

疑難雜症!我總是沉浸在這裏最低的共同標準。我已經回答了足夠多的問題,其中有人依賴InnoDB中的記錄順序,我只是假設這意味着什麼。我已經盡力回答你的問題,特別是關於'mysql_insert_id()' – JNevill