13

में प्राथमिक कुंजी कॉलम में ऑटो वृद्धि वापस जोड़ें गलती से मैंने अपनी तालिका के आईडी फ़ील्ड से ऑटोइनक्रिकमेंट विकल्प हटा दिया। क्या कोई मुझे बता सकता है कि मैं माइग्रेशन के माध्यम से वापस ऑटोइनक्रिकमेंट के विकल्प को फिर से जोड़ सकता हूं?रेल

उत्तर

18

प्रयास करें:

change_column :my_table, :id, :primary_key 

या

my_table.change_column :id, :primary_key 

कुछ रेल डेटाबेस एडेप्टर आप प्राथमिक कुंजी पर change_column कॉल नहीं कर सकते। अगर ऐसा है तो आप हमेशा सीधे एसक्यूएल का उपयोग कर परिवर्तन प्रदर्शन करने के लिए execute कॉल कर सकते हैं:

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 का उपयोग करें।

+0

यार प्रतिक्रिया के लिए Thnx, लेकिन मैंने वास्तव में कुछ प्राथमिक कुंजी पर change_column पहले से ही किया है। यही कारण है कि यह प्राथमिक कुंजी विकल्प से पहले से ही मौजूदा ऑटो वृद्धि विकल्प को हटा दिया गया है। –

+0

कोई समस्या नहीं है। मेरा अपडेट देखें। – vladr

1

आपका पोस्टग्रेस कोड काम नहीं करता है, एक वैकल्पिक तालिका कथन में धारावाहिक या bigserial का उपयोग करना असंभव है। PostgreSQL के लिए सही एसक्यूएल

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

मैं अन्य संस्करणों की जांच नहीं की, बल्कि ऑन रेल्स 5 तुम सिर्फ auto_increment विकल्प सेट कर सकते हैं:

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 

या आप एक bigint चाहते हैं