По ошибке я удалил параметр автоинкремента из поля id моей таблицы. Может ли кто-нибудь сказать мне, как я могу повторно включить опцию автоинкремента через миграцию?
Добавить автоинкремент обратно в столбец первичного ключа в Rails
Ответ 1
Try:
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
.
Ответ 2
Я не проверял другие версии, но на 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
Ответ 3
Ваш код Postgres не работает, невозможно использовать серийный или bigserial в инструкции ALTER TABLE. Правильный SQL для PostgreSQL -
ALTER TABLE table ALTER COLUMN id TYPE int
ALTER TABLE table ALTER COLUMN id TYPE bigint
Ответ 4
Я работаю в ruby на рельсах используя mysql
change_column: table_name,: id,: bigint, null: false, unique: true, auto_increment: true Я использовал этот код, который хорошо работает в mysql, но после удаления строки номер идентификатора не используется, вместо этого переход на следующий номер, как решить этот вопрос.... заранее спасибо