2012-03-13 131 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