在MySQL中插入后,在Ruby中获取受影响的行?

时间:2011-11-17 02:01:15

标签: mysql ruby

相当直接的问题。我只想返回由SQL INSERT查询创建的受影响的行,以便从中获取数据。

我想,有一种方法我可以做到,但我希望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 个答案:

答案 0 :(得分:4)

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函数执行此操作:

  

返回上一个AUTO_INCREMENTINSERT语句为UPDATE列生成的值。

因此,您可以执行INSERT,然后通过调用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。
  4. 你可以SELECT last_insert_id()last_insert_id()是特定于会话的,所以你在使用它时不必担心其他进程。