Rails

13

numaralı anahtardaki birincil anahtar sütuna otomatik artış ekleyin. Yanlışlıkla tablonun kimlik alanından otomatik ödeme seçeneğini kaldırdım. Göç yoluyla geri dönüş seçeneğini nasıl yeniden eski haline getirebileceğimi söyleyen var mı?Rails

cevap

18

Dene:

change_column :my_table, :id, :primary_key 

veya

my_table.change_column :id, :primary_key 

Bazı Raylar veritabanı adaptörleri birincil anahtara change_column diyelim olmayabilir. Bu durumda o zaman her zaman doğrudan SQL kullanarak değişiklik gerçekleştirmek için execute çağırabilirsiniz:

MySQL:

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

PostgreSQL (Yöntem 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 yöntemi) :

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"}) 

Eğer bigint kullanmak istemiyorsanız/bigserial (64-bit) yerine, int(11)/integer/serial kullanın.

+0

Yor yanıtı için Thnx, Ama aslında birincil anahtarların bazılarında change_column işlemini tamamlamış oldum.Ancak bu yüzden zaten var olan Otomatik Artış seçeneğini birincil anahtar seçeneğinden kaldırmış olabilir. –

+0

Sorun değil. Güncellemeye bakın. – vladr

1

Sizin Postgres kodunuz çalışmıyor, ALTER TABLE deyiminde seri veya bigserial kullanmak imkansız. PostgreSQL için Doğru SQL

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

ben başka sürümler kontrol etmedi ama Raylar 5 üzerinde sadece auto_increment seçeneği ayarlayabilirsiniz geçerli:

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

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

Veya bir bigint isterseniz