PostgreSQL NextVal生成现有值[英] postgresql nextval generating existing values

本文是小编为大家收集整理的关于PostgreSQL NextVal生成现有值的处理方法,想解了PostgreSQL NextVal生成现有值的问题怎么解决?PostgreSQL NextVal生成现有值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我必须从基于MySQL的Ruby迁移到Rails应用程序到使用PostgreSQL.没有问题,但到目前为止,我不知道如何解决它.

数据的迁移带来了ID和postgresql现在具有现有ID的问题列中的价值,虽然您可能认为这将是一个好主意.在任何情况下,它现在都与现有的ID值碰撞.从标准ror迁移创建的ID列被定义为

not null default nextval('geopoints_id_seq'::regclass)

是否有一些作为基地的值可以被黑攻击?现在可以在20个左右左右出现这个问题:我可以使用

'select max(id) from <table_name>' 

但这似乎使自动增值专栏毫无意义.

如何最好地处理?

推荐答案

postgres适配器.您可以调用它,它将将其设置为max(id)+ 1,可能是您想要的.

在一些项目中,我经常获得数据,以便为所有型号或指定的模型来保证耙任务.这是任务 - 将其包含在一些rakefile或它在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
现在,您可以使用rake reset_sequences或通过传递类名使用rake reset_sequences或特定模型来运行此功能

其他推荐答案

rails 3版本如下所示:

namespace :db do
  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 }
      ActiveRecord::Base.subclasses.select { |c|c.base_class== c}.sort_by(&:name).each do |klass|
        classes << klass
      end
    end
    classes.each do |klass|
      puts "reseting sequence on #{klass.table_name}"
      ActiveRecord::Base.connection.reset_pk_sequence!(klass.table_name)
    end
  end
end

https://gist.github.com/909032

其他推荐答案

使用该定义,列将从Geopoints_id_seq序列获取下一个值. 该序列不直接连接到表中.如果您正在迁移数据,则必须创建或更新该序列,以便其起始点大于表中的当前最大ID.

您应该能够使用e.g.

设置新值.

   ALTER SEQUENCE geopoints_id_seq RESTART with 1692;

或从table_name中选择max(id);产量

本文地址:https://www.itbaoku.cn/post/1763824.html