Как сделать ретроактивное добавление первичного ключа к таблице в рельсах?
Я создал таблицу без первичного ключа (: id = > false), но теперь он вернулся, чтобы укусить мою задницу.
Мое приложение уже готово, и я не могу просто отбросить его и воссоздать еще один.
Есть ли способ выполнить миграцию, чтобы добавить другой столбец первичного ключа auto increment в мою таблицу?
Ответы
Ответ 1
Команда добавления первичного ключа в перенос:
add_column :my_table, :id, :primary_key
Однако формулировка вашего вопроса предполагает, что в вашей таблице уже есть столбец с автоматическим увеличением. Если я не ошибаюсь, существует несколько СУБД, которые не допускают более одного столбца автоматического увеличения в таблице.
Если у вас уже есть столбец с автоматическим увеличением, и вы действительно хотите использовать этот столбец в качестве основного ключа, просто добавьте в свою модель следующее:
set_primary_key "my_existing_column"
Или в более поздних версиях Rails:
self.primary_key = "my_existing_column"
В том случае, если у вас уже есть столбец с автоматическим увеличением, и вы не можете использовать его в качестве первичного ключа, вам может быть не повезло.
Ответ 2
Если по какой-то причине вы создали таблицу с пользовательским полем id
, но забыли установить id
в качестве первичного ключа, вам нужно выполнить миграцию, чтобы создать ограничение первичного ключа. Для базы данных PostgreSQL было протестировано следующее:
class AddPrimaryKeyConstraintToFoobars < ActiveRecord::Migration
def up
execute "ALTER TABLE foobars ADD PRIMARY KEY (id);"
end
def down
execute "ALTER TABLE foobars DROP CONSTRAINT foobars_pkey;"
end
end
Ответ 3
Я знаю в mySQl, что вы можете добавить столбец с индексом по умолчанию.
Если вы добавите это, то каждая строка будет иметь уникальное значение int (и любая новая строка получит значение int 1 больше, чем последняя добавленная строка)
Вы можете добавить этот столбец и установить его как первичный ключ.
Ответ 4
Была ли эта таблица соединений, которая теперь должна стать реальной моделью с первичным ключом? Если это так, лучше всего создать новую таблицу и скопировать данные в нее.