Подтвердить что ты не робот

Как сделать ретроактивное добавление первичного ключа к таблице в рельсах?

Я создал таблицу без первичного ключа (: id = > false), но теперь он вернулся, чтобы укусить мою задницу.

Мое приложение уже готово, и я не могу просто отбросить его и воссоздать еще один.

Есть ли способ выполнить миграцию, чтобы добавить другой столбец первичного ключа auto increment в мою таблицу?

4b9b3361

Ответ 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

Была ли эта таблица соединений, которая теперь должна стать реальной моделью с первичным ключом? Если это так, лучше всего создать новую таблицу и скопировать данные в нее.