mysql
  • ruby-on-rails
  • ruby
  • activerecord
  • 2010-03-06 2 views 3 likes 
    3

    Этот код работает на моем локальном RoR/Windows 7 (64-бит):При использовании raw ActiveRecord :: Base.connection(), как получить последнее вставленное значение первичного ключа?

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

    но всегда показывает "0"

    По различным причинам я не могу использовать ActiveRecord в этой ситуации.

    (Примечание: приведенный выше код работает нормально на моем общем хосте. Также обратите внимание: мне пришлось заменить mysql5 \ bin \ libmySQL.dll другой DLL на другой ответ на StackOverflow.com, чтобы получить ЛЮБОЕ соединение с базой данных работать.)

    ответ

    1

    Если сомневаетесь получить от MySQL:

    SELECT LAST_INSERT_ID() 
    

    возвращает последний идентификатор, используемый для вставки. Обязательно заблокируйте оба оператора в синхронизированном блоке, если вы выполняете многопоточность.

    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_sql в mysql_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 
    
    +0

    извините, но все еще не работает. Он все равно возвращает 0 каждый раз. :( –

    +0

    Я тестировал это, и это сработало для меня. Возможно ли, что БД выдает ошибку? –

    Смежные вопросы