Я нашел "чистый SQL" ответами на этот вопрос. Существует ли способ, в направляющих, сбросить идентификационное поле для определенной таблицы?
Почему я хочу сделать это? Поскольку у меня есть таблицы с постоянно движущимися данными - редко больше чем 100 строк, но всегда отличающийся. Это до 25k теперь, и нет только никакого смысла в этом. Я предназначаю при использовании планировщика, внутреннего к приложению для направляющих (rufus-планировщик) для выполнения идентификационного полевого сброса ежемесячно или около этого.
Одной из проблем заключается в том, что эти виды полей реализованы по-разному для различных баз данных - последовательности, авто-приращений и т. Д.
Вы всегда можете упасть и повторно добавить таблицу.
Вы можете сделать это в рельсах , если _ids устанавливаются рельсами. До тех пор, пока _ids устанавливаются вашей базой данных, вы не сможете контролировать их без использования SQL.
Сбочная Примечание. Я предполагаю, что используя Rails, чтобы регулярно вызвать процедуру SQL, которая сбрасывает или падает и воссоздает последовательность, не будет чисто SQL-решение, но я не думаю, что это то, что вы спрашиваете ...
Редактировать:
Отказ от ответственности: Я не знаю много о рельсах.
С точки зрения SQL, если у вас есть таблица с столбцами ID First_name last_name
, и вы обычно вставьте в таблицу (first_name, last_name) значения ('bob', 'smith')
Вы можете просто изменить ваши запросы на вставку в таблицу (ID, ID, First_name, last_name) ([Переменная, установленная рельсами], «Боб», «Смит»)
Таким образом, _ID устанавливается Переменная, а не автоматически устанавливается SQL. В этот момент Rails имеет весь контроль над тем, что _IDS (хотя, если это PK, вам нужно убедиться, что вы не используете то же значение, пока оно все еще там).
Если вы собираетесь оставить присвоение до базы данных, вы должны иметь Rails Run (в любом временном расписании) что-то вроде:
DROP SEQUENCE MY_SEQ;
CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1;
к любой последовательности контролирует идентификаторы для вашей таблицы. Это избавится от текущей последовательности и создает новый. Это самый простой способ, которым я знаю о вас «сброс» последовательности.
Я предполагаю, что вам не волнует данные:
def self.truncate!
connection.execute("truncate table #{quoted_table_name}")
end
или если вы сделаете, но не слишком много (есть ломтик времени, когда данные существуют только в памяти):
def self.truncate_preserving_data!
data = all.map(&:clone).each{|r| raise "Record would not be able to be saved" unless r.valid? }
connection.execute("truncate table #{quoted_table_name}")
data.each(&:save)
end
Это даст новые записи, с одинаковыми атрибутами, но идентификатор, начиная с 1.
Что-нибудь , принадлежат_to
Эта таблица может быть закрученным.
Нет нет такой вещи в рельсах. Если вам нужны приятные идентификаторы, чтобы показать пользователи, затем хранят их в отдельной таблице и повторно используйте их.
Вы никогда не упоминали, какие СУБД вы используете. Если это PostgreSQL, адаптер Postgres ActiveRecord имеет RESET_PK_SESCENCENS!
Метод, который вы могли бы использовать:
ActiveRecord::Base.connection.reset_pk_sequence!('table_name')