2011-11-17 61 views
1

非常直接的问题。我只想返回由SQL INSERT查询创建的受影响的行,以便从中获取数据。在MySQL中插入后获取受影响的行?

有一种方法我可以做到这一点,我想,但我希望Mysql或Mysql2 gem提供了一些机制,让我不必做第二个SELECT查询。

我倾向于现在的解决方案是一个类似于:

"INSERT INTO table (col1) VALUES ('value');" 

然后:

"SELECT cid FROM table ORDER BY cid DESC LIMIT 1;" 

由于CID是表的自动递增指数(这是InnoDB的FYI ),它将始终是表中最大的cid值,直到您执行另一个INSERT。

Mysql或Mysql2中是否有任何机制避免必须进行第二次SELECT查询?

+1

看到这个[SO问题](http://stackoverflow.com/questions/7201359/get-last-inserted-id-using-mysql2-gem) –

回答

3

MySQL2有last_id method。该方法的文档是毫无价值的,但implementation looks like this

static VALUE rb_mysql_client_last_id(VALUE self) { 
    GET_CLIENT(self); 
    REQUIRE_OPEN_DB(wrapper); 
    return ULL2NUM(mysql_insert_id(wrapper->client)); 
} 

和MySQL mysql_insert_id功能做到这一点:

返回由以前INSERTUPDATE语句的AUTO_INCREMENT列生成的值。

所以,你可以做你的插入,然后通过调用last_id方法得到最后的ID。

而且顺便说一句,你目前的做法:

SELECT cid FROM table ORDER BY cid DESC LIMIT 1; 

是不是安全的,如果你在一个多进程环境中的时候,考虑一下:

  1. 您插入一行。
  2. 另一个进程插入一行。
  3. SELECT cid FROM table ORDER BY cid DESC LIMIT 1并从(2)获得ID。

你可以SELECT last_insert_id()虽然last_insert_id()是会话专用的,所以你不必使用时不用担心其他进程。

+0

非常棒,谢谢! –

相关问题