2009-09-15 1 views
8

Я развертываю приложение rails для heroku, которое использует PostgreSQL в качестве исходного. В моей миграции базы данных я обычно устанавливаю поле идентификатора для вещей, которым нравится отчеты и т. Д., По меньшей мере 1000, большинство клиентов, похоже, не любят начинать с 1.Как установить начальную точку для столбца первичного ключа (идентификатора) в Postgres через миграцию рельсов

Обычно я использую mysql, и я просто добавляю sql-специфику после моей таблицы создание:

def self.up 
    create_table :reports do |t| 
     t.references :something 
     ... 
    end 
    execute("ALTER TABLE reports AUTO_INCREMENT = 1000;") 
end 

кто-нибудь знает, как я могу получения идеальной то же самое для PostgreSQL, в идеале я хотел бы миграцию создания таблицы себя так, что это не БД специфичны.

Я думаю, глупый способ достижения моей цели состоял в том, чтобы создать и удалить 999 записей в цикле, ой.

ответ

15

Понятия не имеет, о рубинами и железных дорогах части, но запрос, вы говорите о том,

ALTER SEQUENCE reports_something_seq RESTART 1000; 

Вы должны смотреть вверх таблицу для названия последовательности и PostGreSQL документации для общего образования по данному вопросу; -)

+1

Спасибо и за обновление, я просто снесены дамп БД, похоже, это одна: CREATE SEQUENCE reports_id_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; – tsdbrown

+0

Да, вы можете установить start на 'CREATE SEQUENCE', в этом случае вы просто добавляете' START 1000' в инструкцию. Но для его изменения позже вам понадобится команда «ALTER», а не 'CREATE'. –

+1

Ха-ха, спасибо, я не пытался использовать команду CREATE, просто выделив, что «было» использовано для генерации последовательности, это SQL, сгенерированный из файла миграции. Я использовал ALTER и RESTART, как вы упомянули, и сработало обаяние. Если я собираюсь использовать Postgres в производственном приложении, я обязательно прочитаю об этом. – tsdbrown

8

В postgres, как и во многих других базах данных, функция автоматического увеличения увеличивается через Sequences. Для каждой последовательности последовательностей Serial и подобных полей автоматически создаются Postres для вас и называются что-то вроде TABLENAME _ COLUMNNAME _ seq.

Таким образом, вы должны просто изменить соответствующую последовательность, например:

ALTER SEQUENCE example_id_seq RESTART 1000 -- corrected from START 
+1

hah, я сделал ту же ошибку, но исправил после поиска '\ h alter sequence' на всякий случай ;-) Это' RESTART', а не 'START'. 'START' для' CREATE SEQUENCE'. –