首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据最后一个条目而不是第一个空格自动递增id

根据最后一个条目而不是第一个空格自动递增id
EN

Stack Overflow用户
提问于 2013-03-12 20:11:56
回答 2查看 796关注 0票数 2

目前我有一个users和一个assets表(postgres后端),当用户创建一个新资产时,它会填充资产id,如预期的1、2、3等,根据我们当前的资产标记方法显示为###1。

作为资产管理系统的一部分,我们需要导入从当前系统导出的资产。我使用roo和find_by_or_initialize使用它们的当前id来创建这些资源。但是,当我添加一个新资产时,它使用第一个空闲的id,而不是序列中的下一个。这不是问题,但在现有的管理系统中有大约200个丢失的数字,目前除了手动添加它们之外,我想不出其他解决方案。

有没有办法让id不使用第一个空格,比如1,2,6,7,8,12?

这是资产的create方法

代码语言:javascript
复制
def create
  @asset = current_user.assets.build(params[:asset])
   if @asset.save
    redirect_to root_path
    flash.now[:success] = "Asset created!"
  else
   render 'static_pages/home'
  end
end

这是用于导入现有资产的方法

代码语言:javascript
复制
def self.import(file)
  spreadsheet = open_spreadsheet(file)
  header = spreadsheet.row(1)
  (2..spreadsheet.last_row).each do |i|
    row = Hash[[header, spreadsheet.row(i)].transpose]
    asset = find_or_initialize_by_id(spreadsheet.cell(i, 'A')) || new
    asset.attributes = row.to_hash.slice(*accessible_attributes)
    asset.save!
  end
end

编辑:这是当前行为的一个示例

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-13 02:15:00

我对此进行了思考,并从reddit上的一些人那里听取了一些建议,并意识到合理的解决方案是重新启动asset_id_seq的postgres序列,使其恢复到现有管理系统中的最后一个值。

我已经包含了针对这种情况的相关命令;

代码语言:javascript
复制
asset_development=# alter sequence assets_id_seq restart with 1479;
ALTER SEQUENCE
asset_development=# \d assets_id_seq
        Sequence "public.assets_id_seq"
    Column     |  Type   |        Value
---------------+---------+---------------------
 sequence_name | name    | assets_id_seq
 last_value    | bigint  | 1479
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | f
Owned by: public.assets.id
票数 1
EN

Stack Overflow用户

发布于 2013-03-13 10:22:27

如果拥有序列号是非常重要的,那么你可以用老式的方法来做。禁用自动递增,将最后一个数字存储在某个特殊的表中,然后在每次需要新的数字时递增并重新保存该数字。

或者,您可以只执行如下操作:从ASSETS中选择MAX(id) ...

不过要小心,有几个非常好的理由让DB自动递增,而不仅仅是滚动您自己的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15360869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档