2011-11-17 75 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

非常棒,謝謝! –

相關問題