Rails:ActiveRecord如何生成下一个主键



我正在保存后回调方法中打印记录的id,如下所示。打印完"id"后,我将引发异常。

def after_save_run
puts "id is #{self.id}"
raise "exception"
end

上述方法为每个保存调用生成以下输出

id is 1
id is 2
id is 3

由于after save方法中的异常,数据库中没有保存任何记录,因此我的表是空的,但随后acitverecord如何自动递增主键?如果表中没有记录,那么activerecord如何知道最后生成的id是什么?

这是因为在内部,ID不是由Rails决定的,而是由RDBMS中的"序列"给定的。这个序列是一个运行计数器,每当你从中提取一个新的数字时,它就会递增——无论你是否真的将该数字提交到表中。

这意味着尝试插入新行将增加序列计数器,并且由于您正在引发异常,因此不会保存该行。但这并不能改变这样一个事实,即一个数字已经从序列中提取出来,不能再放回序列中

序列在很大程度上也是表不可知的——如果你愿意,你可以在表之间共享相同的序列

https://www.postgresql.org/docs/current/functions-sequence.html

相关内容

  • 没有找到相关文章

最新更新