如果使用原始ActiveRecord :: Base.connection(),如何获取最后插入的主键值?

时间:2010-03-06 22:47:38

标签: mysql ruby-on-rails ruby activerecord

此代码在我的本地RoR / Windows 7(64位)上运行:

sql = ActiveRecord::Base.connection()
last_pk = sql.insert("insert into manual (name) values ('hello new value')")
puts 'last_pk=', last_pk

但始终显示“0”。

由于各种原因,我无法在这种情况下使用ActiveRecord。

(注意:上面的代码在我的共享主机上运行正常。 另请注意:我必须在StackOverflow.com上将mysql5 \ bin \ libmySQL.dll替换为另一个不同的DLL,以便使任何数据库连接正常工作。)

2 个答案:

答案 0 :(得分:1)

将您的代码更改为使用insert_sql而不是insert,即

last_pk = sql.insert_sql("insert into manual (name) values ('hello new value')")
puts "last_pk=#{last_pk}"

insert_sql调用应该返回主键。这是insert_sqlmysql_adapter.rb的代码。

def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
  super sql, name
  id_value || @connection.insert_id
end

答案 1 :(得分:1)

如果有疑问,请从mysql获取:

SELECT LAST_INSERT_ID()

将返回用于插入的最后一个id。如果进行多线程处理,请确保在同步块中锁定两个语句。