Как сбросить поле автоинкремента в миграции ActiveRecord? - PullRequest
14 голосов
/ 13 января 2012

В моей миграции у меня есть:

def up
   MyModel.destroy_all
   MyModel.create!({:id=>1,:name=>'foo'})
   MyModel.create!({:id=>2,:name=>'fooBar'})
   MyModel.create!({:id=>3,:name=>'fooNull'})
end

, потому что мне нужно переопределить данные, которые уже были в таблице my_models

Но хотя я указываю id на MySQL, этопродолжает нумерацию с той позиции, в которой она уже была.

Мне нужно установить счетчик на автоприращение для id, чтобы иметь только 3 новые записи с этими значениями идентификатора через миграцию Active Record на моем Ruby on Railsприложение.

Ответы [ 3 ]

24 голосов
/ 13 января 2012

У вас есть 2 отдельных вопроса. Во-первых, вы пытаетесь указать идентификатор с массовым назначением, рельсы не позволят вам сделать это. См. Переопределение идентификатора при создании в ActiveRecord , чтобы узнать, как это сделать.

Другая проблема заключается в том, что автоинкремент не сбрасывается. Каждая СУБД имеет уникальный способ установки счетчика приращений, и rails не дает вам общего способа доступа к ним, хотя он реализован для некоторых из них (не MySQL), см. Способ Rails для сброса seed по id поле

Так что для этого вам нужно будет запустить специфичный для MySQL SQL, который выглядит примерно так:

ALTER TABLE my_models AUTO_INCREMENT = 1;

Это должно сбросить номер после наибольшего идентификатора в вашей таблице (1, если их нет)

10 голосов
/ 01 апреля 2015

Если вы используете PostgreSQL, вы можете просто сделать:

ModelName.connection.execute('ALTER SEQUENCE model_name_id_seq RESTART WITH 1')

Например, сброс поля автоинкремента для модели User будет выглядеть так:

User.connection.execute('ALTER SEQUENCE users_id_seq RESTART WITH 1')
5 голосов
/ 18 сентября 2016

В случае, если кто-то еще задается вопросом, как это сделать с помощью MYSQL: вот код, который можно использовать при миграции для сброса автоматического приращения для таблицы:

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1')
  • Где foo_bars будет именем таблицы, авто_инкремент которой вы сбрасываете.

Я понял это благодаря ответу на на этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...