sql >> Database >  >> RDS >> PostgreSQL

postgresql nextval genereert bestaande waarden

Er is een reset_pk_sequences! methode op de Postgres-adapter . Je kunt het aanroepen en het zal het instellen op max(id) + 1, wat waarschijnlijk is wat je wilt.

In sommige projecten krijg ik gegevens vaak genoeg ETL'ed om een ​​rake taak te rechtvaardigen om dit voor alle modellen of voor een bepaald model te doen. Dit is de taak - neem het op in een Rakefile of in zijn eigen onder 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

U kunt dit nu uitvoeren voor alle modellen (gedefinieerd onder RAIS_ROOT/app/modellen) met behulp van rake reset_sequences , of voor een specifiek model door een klassenaam door te geven.



  1. Werk een rij bij in orakel met behulp van de OLEDB-opdracht (SSIS)

  2. Boomstructuur in sql in Oracle.Hoe boom, onderliggende knooppunten en bovenliggende knooppunten in SQL Oracle weer te geven

  3. Verbetering van de prestaties van Postgres jsonb-query's in combinatie met relationele query's

  4. Prestatiegerelateerde oplossingen voor SQL Server 2012