Как заставить первичный ключ в ActiveRecord с PostgreSQL начать с определенного целочисленного значения? - PullRequest
2 голосов
/ 26 сентября 2011

Отсюда: Как запустить первичный ключ с 1000? Кажется, мне нужно выполнить команду SQL: ALTER TABLE tbl AUTO_INCREMENT = 1000; Но я имел дело только с базой данных через абстракцию ActiveRecord. Есть ли способ добиться этого с помощью активной записи? Либо во время миграции, либо на лету при создании новой записи в базе данных?

Я попробовал следующее и потерпел неудачу:

@record= myRecord.new
while @record.id < 1000 do
    @record= myRecord.new
end

Это неэффективно, но это может произойти только один раз, однако Rails сообщает, что @ record.id равен nil, поэтому не может выполнить <сравнение и поэтому я пытаюсь сначала сохранить @record, а затем посмотреть, какому значению id (первичного ключа) он был присвоен базой данных </p>

@record.save
if @record.id <1000
    @record.id = 1000 + @record.id
    @record.save!             
end

Каким-то образом rails сообщает, что одно из уникальных полей в @record уже существует, поэтому не может снова сохранить @record.

РЕДАКТИРОВАТЬ: мой плохой, выше, это команда MySQL ... для PostgreSQL, это похоже на что-то вроде (http://archives.postgresql.org/pgsql-general/2006-10/msg01417.php):

 SELECT setval('id_seq',100111);

Однако я попытался запустить его на консоли Ruby моей среды развертывания (общая база данных на Heroku), и я только что получил! Внутренняя ошибка сервера вернулась :-( мой рубиновый класс называется:

class Mytable < ActiveRecord::Base

поэтому я запускаю эту команду:

Mytable.connection.execute('SELECT setval('id_seq', 1000)')

и получил внутреннюю ошибку сервера (попытался использовать и 'id', и 'id_seq' в приведенной выше команде) Но это может быть какая-то проблема с Ruby для конкретной проблемы Heroku, которая вызывает проблему, поэтому я бы занялся расследованием и отправил другой вопрос вместо того, чтобы изменить его. Спасибо!

Дополнительные материалы, относящиеся к командам PostgreSQL:

http://pointbeing.net/weblog/2008/03/mysql-versus-postgresql-adding-an-auto-increment-column-to-a-table.html

http://archives.postgresql.org/pgsql-general/2006-10/msg01417.php

Как сбросить последовательность первичных ключей postgres, если они не синхронизированы?

1 Ответ

4 голосов
/ 26 сентября 2011

Вы можете выполнить raw sql следующим образом:

ActiveRecord::Base.connection.execute('ALTER TABLE tbl AUTO_INCREMENT = 1000');

Или от любого потомка ActiveRecord :: Base (т.е. любого класса модели), например:

MyRecord.connection.execute('ALTER TABLE tbl AUTO_INCREMENT = 1000')
...