2012-03-13 125 views
1

什麼我做的是clonning舊的數據庫,以新的不同的結構,但應該有相同的舊數據mysql是否可以插入到插入?

是有可能做到的插入插入返回插入查詢的ID

INSERT INTO tab1 (nom,id_2) VALUES 
("jack",(INSERT INTO tab2 (pass) VALUES ("1234"))); 

INSERT INTO tab2 (pass) VALUES ("1234")我想插入

,但沒有運氣的ID! (我想這在一個SQL查詢(我已經知道mysql_insert_id))提前

感謝

+0

? – 2012-03-13 10:52:20

+0

爲什麼不能有兩個單獨的陳述?第一個將插入到tab2中,第二個將使用相同的值並插入到tab1中。 – 2012-03-13 10:54:59

+0

如何在'tab2'上插入行,然後使用'last_insert_id()':http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id – 2012-03-13 10:55:24

回答

4

你不能這樣做在一個查詢 - 使用mysql_insert_id()來獲得最後插入的ID,例如:

mysql_query('INSERT INTO tab2 (pass) VALUES ("1234")'); 
$lastid = mysql_insert_id(); 
mysql_query('INSERT INTO tab1 (nom,id_2) VALUES ("jack",'.$lastid.')'); 
+0

我只希望它在一個SQL查詢(我已經知道有關mysql_insert_id) – mgraph 2012-03-13 10:54:52

+0

@mgraph即時通訊我會害怕你不能! – ManseUK 2012-03-13 10:58:37

1

鎖定表格,插入,選擇max(id),解鎖表格。這是在postgres之外創建自己的序列表之外唯一的方法,如果您由於某種原因對最後一個insert id函數不利。然而,這種方法就像將焦油倒入攪拌機中,如果您的桌子是中等到高寫入的話。

+0

如果您有多個併發數據庫訪問,max(id)不是很好......不要濫用您的數據庫,請使用mysql_insert_id(); – 2012-03-13 12:57:45

+0

@MarkBaker如果多個連接嘗試訪問表,它確實會創建一個logjam,但它會可靠地報告在鎖定表內插入的最後一個ID。 – Ray 2012-03-13 13:43:39

1

您不能將其作爲單個插入來執行,因爲插入是原子化的,直到語句完成才確定ID。

將這兩個語句包裝在一個事務中,你將得到你的ID和原子性。

3

插入ID在MySQL中可獲取的一樣,所以這裏是沒有涉及的PHP版本(然而它執行2個查詢)

INSERT INTO tab2 (pass) VALUES ("1234"); 
INSERT INTO tab1 (nom,id_2) VALUES("jack",LAST_INSERT_ID()); 
要從TAB2表ID
+0

@mgraph - 你被告知你不能......你爲什麼要在一個查詢中查找它? – 2012-03-13 12:58:29

+0

@mgraph使用多插入,它將生成順序標識符。然後獲取第一個,然後在循環中增加它 – 2012-03-13 13:54:19