Przez pomyłkę usunąłem opcję autoinkrementacji z pola id mojej tabeli. Czy ktoś może mi powiedzieć, w jaki sposób mogę ponownie włączyć opcję autoregulacji po migracji?Dodaj auto-increment z powrotem do kolumny klucza podstawowego w Railsach
13
A
Odpowiedz
18
Spróbuj:
change_column :my_table, :id, :primary_key
lub
my_table.change_column :id, :primary_key
Pewne Szyny adaptery baz danych mogą nie pozwalają nazwać change_column
na klucz podstawowy. Jeśli tak jest, to zawsze można zadzwonić execute
wykonać zmianę używając bezpośrednio SQL:
MySQL:
execute('ALTER TABLE "my_table" CHANGE "id" "id"
bigint DEFAULT NULL auto_increment PRIMARY KEY')
PostgreSQL (metoda 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 (metoda 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"})
Jeśli nie chcesz używać bigint
/bigserial
(64-bit) zamiast tego należy użyć int(11)
/integer
/serial
.
1
Twój kod PostgreSy nie działa, nie można użyć portu szeregowego lub bigserial w instrukcji ALTER TABLE. Poprawne SQL dla PostgreSQL jest
ALTER TABLE table ALTER COLUMN id TYPE int
ALTER TABLE table ALTER COLUMN id TYPE bigint
3
nie sprawdzić inne wersje ale on Rails 5 można po prostu ustawić opcję auto_increment
:
change_column :table_name, :id, :int, null: false, unique: true, auto_increment: true
Albo jeśli chcesz bigint:
change_column :table_name, :id, :bigint, null: false, unique: true, auto_increment: true
Thnx dla yor odpowiedzi, ale faktycznie już zrobiłem change_column na niektóre z podstawowych kluczy. Może dlatego to usunęło już istniejącą opcję Auto Increment z klucza głównego opcji. –
Bez problemu. Zobacz moją aktualizację. – vladr