PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

postgresql nextval gerando valores existentes


Há um reset_pk_sequences! no adaptador Postgres . Você pode chamá-lo e ele o definirá como max(id) + 1, que é provavelmente o que você deseja.

Em alguns projetos, recebo dados ETL com frequência suficiente para garantir uma tarefa de rake para fazer isso para todos os modelos ou para um modelo especificado. Aqui está a tarefa - inclua-a em algum Rakefile ou em seu próprio em lib/tasks:
desc "Reset all sequences. Run after data imports"
task :reset_sequences, :model_class, :needs => :environment do |t, args|
  if args[:model_class]
    classes = Array(eval args[:model_class])
  else
    puts "using all defined active_record models"
    classes = []
    Dir.glob(RAILS_ROOT + '/app/models/**/*.rb').each { |file| require file }
    Object.subclasses_of(ActiveRecord::Base).select { |c|
      c.base_class == c}.sort_by(&:name).each do |klass|
        classes << klass
      end
  end
  classes.each do |klass|
      next if klass == CGI::Session::ActiveRecordStore::Session && ActionController::Base.session_store.to_s !~ /ActiveRecordStore/

        puts "reseting sequence on #{klass.table_name}"
        ActiveRecord::Base.connection.reset_pk_sequence!(klass.table_name)
    end
end

Agora você pode executar isso para todos os modelos (definidos em RAIS_ROOT/app/models) usando rake reset_sequences , ou para um modelo específico passando um nome de classe.