Rails 3 迁移:如何在(非主键)列上自增?

3

我正在寻找一种自动增加列的方法,类似于自动:id列的方式。我可能可以在模型中以某种方式处理这个问题,但那似乎有些笨拙。我在Rails 3中没有找到任何处理这个问题的库;是否有可用的宝石可以处理这个问题?我很惊讶这不是一个选项,因为Rails已经为主键列处理了这个行为。


1
主键列是由数据库自动增加的,MySQL或其他DBMS在每个新记录中都会增加主键。那么你为什么需要另一个递增的列呢? - Alex
如果您不计划更改数据库,可以在迁移中使用“execute”来使用原始SQL添加另一个序列/自增字段。然而,如果您最终将拥有两个都是自增的列,它们不是同一列吗?我意识到纯粹主义者此时会敲打我的头,但是... - user483040
2个回答

1

通常,自动递增列是使用数据库序列实现的。使用序列而不是计算下一个递增值的优点在于,从序列获取下一个值是原子性的。因此,如果您有多个进程创建新元素,则序列将确保您的数字真正唯一。

序列可用于postgresql、oracle、mysql等。

例如,如果您正在使用postgres,如何实现此功能:

  • 从序列中选择下一个值:

    Integer(Operator.connection.select_value("SELECT nextval('#{sequence_name}')"))

  • 创建序列:

    Operator.connection.execute("CREATE sequence #{sequence_name}")

  • 设置序列的起始值:

    Operator.connection.execute("SELECT setval('#{sequence_name}', #{new_start_serial})")
    

希望这有所帮助。


0
如果你真的觉得需要这个功能,你可以在模型中创建一个 before_create 过滤器来检查最后一条记录的属性值并将其加1。但感觉像是黑客攻击。

我同意--这似乎很hackish。至于为什么我需要这样的东西:自动增量不仅适用于数据库中的主键。在这种情况下,我正在添加一系列步骤,并且不喜欢必须显式地对它们进行编号,当Rails可以代替我完成时。我可能需要编写这个gem。 - sabat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接