更改起始ID号

Jef*_*.D. 15 ruby-on-rails

我在Rails中有一个"帐户"模型,在数据库中有相应的"帐户"表.如果我擦除数据库并重新开始,'account_id'字段将始终从1开始并从那里开始计数.我想更改起始编号,这样,当在新数据库中创建第一个帐户时,'account_id'就是1000.有没有办法在Rails中执行此操作,或者我是否需要专门的数据库独立的SQL代码?

为了便于说明,这里是我的"帐户"表的简化版本:

create_table "accounts", :force => true do |t|
  t.string   "email", :null => false
  t.string   "crypted_password", :null => false
  t.string   "name", :null => false
  t.boolean  "email_verified", :default => false
end
Run Code Online (Sandbox Code Playgroud)

Llu*_*uís 15

对于PostgreSQL:

execute("ALTER SEQUENCE accounts_id_seq START with 1000 RESTART;")
Run Code Online (Sandbox Code Playgroud)

请参阅https://www.postgresql.org/docs/current/static/sql-altersequence.html

  • 如果人们不知道(我不是),要在控制台中执行命令,请运行ActiveRecord :: Base.connection.execute("... (9认同)

小智 10

您需要执行一些专门的数据库相关SQL才能获得此功能.

如果您使用的是MySQL,则可以在代码之后将以下代码添加到迁移中create_table:

execute("ALTER TABLE tbl AUTO_INCREMENT = 1000")
Run Code Online (Sandbox Code Playgroud)


小智 5

对于sqlite

序列存储在表中sqlite_sequence(name,seq)

  • 首先检查序列是否已存在?

    select name,seq from sqlite_sequence where name = 'accounts'

如果sequence.empty?

insert into sqlite_sequence(name,seq) values('accounts', 1000);

其他

update sqlite_sequence set seq = 1000 where name = 'accounts';


wve*_*gen 5

一种纯 Ruby、独立于数据库的方法可能是:

class MyModel
  before_create do
    self.id = [1000, (self.class.maximum(:id) || 0) + 1].max if self.id.nil?
  end
end
Run Code Online (Sandbox Code Playgroud)

当您一次创建大量记录时,这可能表现不佳。