2011-03-25 51 views
9

是否可以插入一行并获取插入到相同查询中的值?MySql:插入一行并获取内容

喜欢的东西...

INSERT INTO `items` (`item`, `number`, `state`) 
(SELECT '3', `number`, `state` FROM `item_bug` WHERE `id`='3') 

然后,获得ID和使用只有一个查询执行

SELECT * FROM `items` WHERE `id`='$id' 

不过。

+0

不知道你问什么才能真正在一个DML查询来完成,但我开始关注此问题,看它是否能 - 这将有助于了解。 – 2011-03-25 13:04:29

+2

两个查询有什么问题? – JohnFx 2011-03-25 13:05:39

+0

没有什么,除了过载.. – Ivan 2011-03-25 15:52:32

回答

4

你可以调用将执行插入,然后从你的应用程序层在一个单一的调用返回结果集的存储过程到MySQL:

存储过程调用

mysql> call insert_user('bar'); 
+---------+----------+ 
| user_id | username | 
+---------+----------+ 
|  1 | bar  | 
+---------+----------+ 
1 row in set (0.02 sec) 

$sqlCmd = sprintf("call insert_user('%s')", ...); 

简单的例子:

drop table if exists users; 
create table users 
(
user_id int unsigned not null auto_increment primary key, 
username varchar(32) unique not null 
) 
engine=innodb; 


drop procedure if exists insert_user; 

delimiter # 

create procedure insert_user 
(
in p_username varchar(32) 
) 
begin 
declare v_user_id int unsigned default 0; 

insert into users (username) values (p_username); 

set v_user_id = last_insert_id(); 

-- do more stuff with v_user_id e.g. logs etc... 

select * from users where user_id = v_user_id; 

end# 

delimiter ; 

call insert_user('bar'); 
+0

看起来比使用2个mysql查询要慢,不是吗? – Ivan 2011-03-25 15:54:04

+5

会跳进你的车,开车去超市买面包,然后开车回家,然后开车买牛奶比开车去超市买面包和牛奶快吗?一两次? – 2011-03-25 16:21:53

+0

太棒了!感谢支持! – Luc 2013-07-29 02:07:55

5

不,这不可能在MySQL(不像PostgreSQLSQL ServerPL/SQLOracle)。

您必须在单独的查询中完成。

0

如果你正在使用PHP然后

,而不是这个,你可以使用

mysql_insert_id(); 

,这将给最后插入记录的ID。

其他数据将与插入的相同。 只有id会改变,你可以通过mysql_insert_id()

所以你不需要运行第二个查询。

+0

是的,谢谢,我知道,但这不是我的问题:) – Ivan 2011-03-25 15:52:54

7

执行INSERT语句中,然后你可以这样做:

SELECT * FROM `items` WHERE `id`= LAST_INSERT_ID() 
+0

它如何插入一行? – Quassnoi 2011-03-25 13:12:31

+0

@Quassnoi:对不起,如果我不清楚。期望的是OP执行原始问题中给出的INSERT语句。我会更好地填充答案。 – 2011-03-25 13:20:17

+0

原始问题要求“插入一行并获取插入到相同查询中的值”。 – Quassnoi 2011-03-25 13:25:47