Antwort

18

Versuchen:

change_column :my_table, :id, :primary_key 

oder

my_table.change_column :id, :primary_key 

Bestimmte Rails Datenbank-Adapter können Sie change_column auf dem Primärschlüssel nicht zulassen nennen. Wenn das der Fall ist, dann können Sie immer execute rufen Sie die Änderung mit SQL direkt ausführen:

MySQL:

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

PostgreSQL (Methode 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 (Methode 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"}) 

Wenn Sie nicht wollen, bigint verwenden/bigserial (64-Bit), verwenden Sie stattdessen int(11)/integer/serial.

+0

Thnx für Ihre Antwort, aber ich habe tatsächlich bereits change_column auf einigen der Primärschlüssel getan. Vielleicht ist das der Grund, warum es die bereits bestehende Auto Increment-Option aus der Primärschlüssel-Option entfernt. –

+0

Kein Problem. Siehe mein Update. – vladr

1

Ihr Postgres-Code funktioniert nicht, es ist unmöglich, Serial oder Bigserial in einer ALTER TABLE-Anweisung zu verwenden. Richtige SQL for PostgreSQL ist

ALTER TABLE table ALTER COLUMN id TYPE int 
ALTER TABLE table ALTER COLUMN id TYPE bigint 
3

ich nicht andere Versionen haben prüfen, aber auf Rails 5 kann man einfach stellen Sie die auto_increment Option:

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

Oder, wenn Sie einen bigint:

change_column :table_name, :id, :bigint, null: false, unique: true, auto_increment: true 
Verwandte Themen