Как я могу задним числом добавить первичный ключ к моей таблице в рельсах? - PullRequest
27 голосов
/ 16 марта 2011

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

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

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

Ответы [ 4 ]

47 голосов
/ 17 апреля 2011

Команда для добавления первичного ключа в миграцию:

add_column :my_table, :id, :primary_key

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

Если у вас уже есть столбец с автоинкрементом, и вы действительно хотите использовать этот столбец какваш первичный ключ, просто добавьте к вашей модели следующее:

set_primary_key "my_existing_column"

или в более поздних версиях Rails:

self.primary_key = "my_existing_column"

Если у вас уже есть столбец автоинкремента и вы не можете использовать его в качестве первичного ключа, вам может не повезти.

4 голосов
/ 06 февраля 2017

Если по какой-то причине вы создали таблицу с настраиваемым полем 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
1 голос
/ 16 марта 2011

Я знаю в mySQl, что вы можете добавить столбец, который имеет значение приращения по умолчанию.Если вы добавите это значение, то каждая строка будет иметь уникальное значение int (и любая новая строка получит значение int на 1 больше, чем последняя добавленная строка)

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

0 голосов
/ 16 марта 2011

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

...