sql >> Database teknologi >  >> RDS >> PostgreSQL

postgresql nextval genererer eksisterende værdier

Der er en reset_pk_sequences! metode på Postgres-adapteren . Du kan kalde det, og det vil sætte det til max(id) + 1, hvilket sandsynligvis er det, du ønsker.

I nogle projekter får jeg data ETL'et ind ofte nok til at berettige en rake opgave til at gøre dette for alle modeller eller for en specificeret model. Her er opgaven - inkluder den i en Rakefil eller i sin egen under lib/opgaver:

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

Nu kan du køre dette enten for alle modeller (defineret under RAIS_ROOT/app/modeller) ved hjælp af rake reset_sequences , eller for en bestemt model ved at indsætte et klassenavn.



  1. Laravel where condition - pgsql-forespørgsel

  2. MySQL Trigger:Slet fra tabel EFTER SLETT

  3. pyodbc.connect() virker, men ikke sqlalchemy.create_engine().connect()

  4. Vælg COUNT i to tabel i én forespørgsel med MYSQL