Mysql 在rails中编写简单的递增计数器

Mysql 在rails中编写简单的递增计数器,mysql,ruby-on-rails,auto-increment,increment,Mysql,Ruby On Rails,Auto Increment,Increment,对于每一张卡片,我想给它们加上一个特殊的数字,递增一 我想我可以在控制器中完成这一切 def create @card = Card.new(params[:card]) @card.SpecNum = @card.SpecNum ++ ... end 或者。我可能是明显的弱智。也许最好的办法是在mysql中添加一个自增表。问题是这个数字必须从一个特定的数字1020开始 有什么想法吗?您可以使用以下命令在每个表的基础上设置(并重置)MySQL的自动增量值: ALTER TABLE不是您希望

对于每一张卡片,我想给它们加上一个特殊的数字,递增一

我想我可以在控制器中完成这一切

def create
 @card = Card.new(params[:card])
 @card.SpecNum = @card.SpecNum ++
...
end
或者。我可能是明显的弱智。也许最好的办法是在mysql中添加一个自增表。问题是这个数字必须从一个特定的数字1020开始

有什么想法吗?

您可以使用以下命令在每个表的基础上设置(并重置)MySQL的自动增量值:

ALTER TABLE不是您希望所有用户都拥有的特权,请参阅关于适当保护它。

您可以使用以下命令在每个表的基础上设置(并重置)MySQL的自动增量值:


ALTER TABLE不是您希望所有用户都拥有的特权,请参阅关于适当保护它的内容。

就我个人而言,我不会将此责任推给数据库或控制器;我喜欢这个模型。比如:

/app/models/card

validates_uniqueness_of :special_number

def before_validation_on_create
  self.special_number = CardSpecialNumber.next!
end
/app/models/card\u special\u number

def self.next!
  last_number_holder = CardSpecialNumber.first
  if last_number_holder.nil?
    CardSpecialNumber.create!(:counter => 1020)
    return 1020
  end

  last_number_holder.counter = last_number_holder.counter + 1
  last_number_holder.save!
  last_number_holder.counter
end

就我个人而言,我不会把责任推给数据库或控制器;我喜欢这个模型。比如:

/app/models/card

validates_uniqueness_of :special_number

def before_validation_on_create
  self.special_number = CardSpecialNumber.next!
end
/app/models/card\u special\u number

def self.next!
  last_number_holder = CardSpecialNumber.first
  if last_number_holder.nil?
    CardSpecialNumber.create!(:counter => 1020)
    return 1020
  end

  last_number_holder.counter = last_number_holder.counter + 1
  last_number_holder.save!
  last_number_holder.counter
end


Ruby没有一个++操作符(或者--,不足为奇!)@John你为什么说“不足为奇”?因为有++而没有--会很奇怪,不是吗?Ruby没有一个++操作符(或者--,不足为奇!)@John你为什么说“不足为奇”?因为有++而没有--会很奇怪,不是吗?如果它只是一个需要递增的数字,我会使用序列或自动递增将其放入数据库中。数据库可以比你做得更有效。我可以想象你需要更多控制的情况,例如顺序很重要,不允许有漏洞,或者一些奇怪的计数算法(例如,我必须创建一个数字yyyy-mm-xxxx,其中xxxx是该月的计数…那么模型确实是最好的地方。顺便说一句,如果没有可用的初始行,上述代码将始终返回1020。@nathanvda:关于1020:你是对的,如果没有初始行,它将返回1020,但Trip要求作为特定要求。在f中)ace,我认为这个要求(从1020开始)是我绕过数据库的决定性因素。我喜欢与不同数据库一起工作的代码;postgres/sqlite3/sqlsever都有不同的递增方式。多数据库命令可能是魔鬼的工作。我只有一种卡的模型。没有一种只用于特殊编号。是否必须将它们分开并使卡成为特殊的l_Number从卡中继承?我认为需要它,因为这将是计数器的存储。它将是一个表,其中只有一条记录(列将是一个名为counter的整数)虽然没有继承,但它们是两个独立的实体。几乎成功了。我有一个递增的数字等等。但奇怪的是,我希望它返回这个数字“294670251400”。我将该数字替换为1020。但它返回的是“2147483647”.奇怪,对吧?奇怪的是,这个数字也停止了递增。如果它只是一个需要递增的数字,我会使用序列或自动递增的方式将其放入数据库。数据库可以比你更有效地完成这项工作。我可以想象,在一些情况下,你需要更多的控制,例如,顺序很重要,不允许有漏洞,或者一些奇怪的计数算法(例如,我必须创建一个数字yyyy-mm-xxxx,其中xxxx是该月的计数…那么模型确实是最好的地方。顺便说一句,如果没有可用的初始行,上述代码将始终返回1020。@nathanvda:关于1020:你是对的,如果没有初始行,它将返回1020,但Trip要求作为特定要求。在f中)ace,我认为这个要求(从1020开始)是我绕过数据库的决定性因素。我喜欢与不同数据库一起工作的代码;postgres/sqlite3/sqlsever都有不同的递增方式。多数据库命令可能是魔鬼的工作。我只有一种卡的模型。没有一种只用于特殊编号。是否必须将它们分开并使卡成为特殊的l_Number从卡中继承?我认为需要它,因为这将是计数器的存储。它将是一个表,其中只有一条记录(列将是一个名为counter的整数)虽然没有继承,但它们是两个独立的实体。几乎成功了。我有一个递增的数字等等。但奇怪的是,我希望它返回这个数字“294670251400”。我将该数字替换为1020。但它返回的是“2147483647”.奇怪,对吗?奇怪的是,数字也停止递增了。嗯..我不想更改表。我想更改列。我尝试过更改列SpecNum AUTO_INCREMENT=1020。它为SQL返回了一个错误syntax@Trip:MySQL只允许每个表有一个自动增量列;您只能使用ALTER table设置值对于AUTO_INCREMENT,根据我提供的文档链接。啊,因为另一个AUTO_incrementer是用于其他重要的东西。我想我还是应该使用这个模型。嗯……我不想更改表。我想更改列。对于我尝试过的列,alter column SpecNum AUTO_INCREMENT=1020。它返回了一个SQL错误syntax@Trip:仅限MySQLy允许每个表有一个自动增量列;根据我提供的文档链接,您只能使用ALTER table设置自动增量的值。啊,因为另一个自动增量列用于其他重要的内容。我想我还是应该使用该模型。