相当直接的问题。我只想返回由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查询?
答案 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_INCREMENT
或INSERT
语句为UPDATE
列生成的值。
因此,您可以执行INSERT,然后通过调用last_id
方法获取最后一个ID。
顺便说一下,你目前的方法:
SELECT cid FROM table ORDER BY cid DESC LIMIT 1;
如果您处于多进程环境中,是不安全的,请考虑以下事项:
SELECT cid FROM table ORDER BY cid DESC LIMIT 1
并从(2)获取ID。你可以SELECT last_insert_id()
,last_insert_id()
是特定于会话的,所以你在使用它时不必担心其他进程。