Направляющие способ сбросить семя на идентификационном поле

Я нашел "чистый SQL" ответами на этот вопрос. Существует ли способ, в направляющих, сбросить идентификационное поле для определенной таблицы?
Почему я хочу сделать это? Поскольку у меня есть таблицы с постоянно движущимися данными - редко больше чем 100 строк, но всегда отличающийся. Это до 25k теперь, и нет только никакого смысла в этом. Я предназначаю при использовании планировщика, внутреннего к приложению для направляющих (rufus-планировщик) для выполнения идентификационного полевого сброса ежемесячно или около этого.

41
задан Trevoke 19 January 2010 в 21:01
поделиться

5 ответов

Одной из проблем заключается в том, что эти виды полей реализованы по-разному для различных баз данных - последовательности, авто-приращений и т. Д.

Вы всегда можете упасть и повторно добавить таблицу.

1
ответ дан 27 November 2019 в 00:05
поделиться

Вы можете сделать это в рельсах , если _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;

к любой последовательности контролирует идентификаторы для вашей таблицы. Это избавится от текущей последовательности и создает новый. Это самый простой способ, которым я знаю о вас «сброс» последовательности.

1
ответ дан 27 November 2019 в 00:05
поделиться

Я предполагаю, что вам не волнует данные:

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 Эта таблица может быть закрученным.

5
ответ дан 27 November 2019 в 00:05
поделиться

Нет нет такой вещи в рельсах. Если вам нужны приятные идентификаторы, чтобы показать пользователи, затем хранят их в отдельной таблице и повторно используйте их.

1
ответ дан 27 November 2019 в 00:05
поделиться

Вы никогда не упоминали, какие СУБД вы используете. Если это PostgreSQL, адаптер Postgres ActiveRecord имеет RESET_PK_SESCENCENS! Метод, который вы могли бы использовать:

ActiveRecord::Base.connection.reset_pk_sequence!('table_name')
121
ответ дан 27 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: