Добавить автоинкремент обратно в столбец первичного ключа в Rails - PullRequest
13 голосов
/ 05 марта 2009

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

Ответы [ 3 ]

19 голосов
/ 05 марта 2009

Попробуйте:

change_column :my_table, :id, :primary_key

или

my_table.change_column :id, :primary_key

Некоторые адаптеры базы данных Rails могут не позволить вам вызвать change_column для первичного ключа. Если это так, то вы всегда можете вызвать execute, чтобы выполнить изменение, используя SQL напрямую:

MySQL:

execute('ALTER TABLE "my_table" CHANGE "id" "id"
  bigint DEFAULT NULL auto_increment PRIMARY KEY')

PostgreSQL (метод 1):

max_id = execute(%%Q{SELECT id FROM "my_table" ORDER BY "id" DESC
  LIMIT 1}).to_a.first
execute(%%Q{CREATE SEQUENCE "my_table_id_seq" START #{max_id+1}})
execute(%%Q{ALTER TABLE "my_table" ALTER COLUMN "id"
  TYPE bigint})
execute(%%Q{ALTER TABLE "my_table" ALTER COLUMN "id"
  SET DEFAULT nextval('my_table_id_seq'::regclass)})
execute(%%Q{ALTER TABLE "my_table" ADD PRIMARY KEY("id")}) 

PostgreSQL (метод 2):

max_id = execute(%%Q{SELECT "id" FROM "my_table" ORDER BY "id" DESC
  LIMIT 1}).to_a.first
execute(%%Q{ALTER TABLE "my_table" RENAME COLUMN "id" TO "id_orig"})
execute(%%Q{ALTER TABLE "my_table" ADD COLUMN "id" bigserial NOT NULL})
execute(%%Q{UPDATE "my_table" SET "id"="id_orig"})
execute(%%Q{ALTER SEQUENCE "my_table_id_seq" RESTART #{max_id+1}})
execute(%%Q{ALTER TABLE "my_table" DROP COLUMN "id_orig"})

Если вы не хотите использовать bigint / bigserial (64-бит), используйте вместо него int(11) / integer / serial.

4 голосов
/ 03 января 2017

Я не проверял другие версии, но в Rails 5 вы можете просто установить параметр auto_increment:

change_column :table_name, :id, :int, null: false, unique: true, auto_increment: true

Или, если вы хотите bigint:

change_column :table_name, :id, :bigint, null: false, unique: true, auto_increment: true
1 голос
/ 30 июля 2009

Ваш код Postgres не работает, невозможно использовать serial или bigserial в инструкции ALTER TABLE Правильный SQL для PostgreSQL -

ALTER TABLE table ALTER COLUMN id TYPE int 
ALTER TABLE table ALTER COLUMN id TYPE bigint
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...