7

मैं रेल ऐप पर रुबी पर काम कर रहा हूं। हम एक PostgreSQL डेटाबेस का उपयोग कर रहे हैं।एक फ़ील्ड में पोस्टग्रेएसक्यूएल अनुक्रम बनाना (जो रिकॉर्ड की आईडी नहीं है)

निम्नलिखित कॉलम के साथ scores नामक एक टेबल है:

Column  | Type 
--------------+----------------------- 
id   | integer 
value   | double precision 
ran_at  | timestamp 
active  | boolean 
build_id  | bigint 
metric_id  | integer 
platform_id | integer 
mode_id  | integer 
machine_id | integer 
higher_better | boolean 
job_id  | integer 
variation_id | integer 
step   | character varying(255) 

मैं एक अनुक्रम को job_id जोड़ने की जरूरत है (ध्यान दें: वहाँ job के लिए कोई मॉडल है)।

मैं इस अनुक्रम को कैसे बना सकता हूं?

उत्तर

18

उपयोग CREATE SEQUENCE: आप बाँध स्तंभ के लिए अनुक्रम (इसलिए जब स्तंभ है इसे नष्ट कर दिया है चाहते हैं

ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq'); 

:

CREATE SEQUENCE scores_job_id_seq; -- = default name for plain a serial 

फिर scores.job_id के लिए एक स्तंभ डिफ़ॉल्ट जोड़ने हटाया गया), यह भी चलाएं:

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id; 

अपनी मेज पहले से ही पंक्तियां हैं तो आप SEQUENCE करने के लिए सेट कर सकते हैं:यह सब स्तंभ job_id के लिए छद्म डेटा प्रकार serial का उपयोग शुरू करने के साथ साथ बदला जा सकता अगले सर्वोच्च मूल्य और तालिका में लापता धारावाहिक मान भरें:

SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 0)) FROM scores; 

वैकल्पिक:

UPDATE scores 
SET job_id = nextval('scores_job_id_seq') 
WHERE job_id IS NULL; 

केवल शेष अंतर है, एक serial स्तंभ भी NOT NULL को तैयार है। आप या नहीं वह भी चाहते हो सकता है हो सकता है:

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL; 

लेकिन आप सिर्फ एक मौजूदा integer के प्रकार में परिवर्तन नहीं कर सकते हैं:


             
  
    ALTER TABLE scores ALTER job_id TYPE serial; 
  

serial एक वास्तविक डेटा प्रकार नहीं है। यह CREATE TABLE के लिए सिर्फ एक उल्लेखनीय सुविधा सुविधा है।

+0

क्या आप ActiveRecord माइग्रेशन का उपयोग करके ऐसा कर सकते हैं? – Tanvir

+2

@taa क्या आपने इसे खोजने की कोशिश की है? http://stackoverflow.com/q/7606994/1499698 http://stackoverflow.com/q/7820747/1499698 – pozs

+0

हाँ, मैंने पहले ही इसे समझ लिया है। धन्यवाद! – Tanvir

13

तो मुझे पता चला कि रेल पर रूबी पर ActiveRecord माइग्रेशन का उपयोग करके इसे कैसे किया जाए। मैंने मूल रूप से इरविन के आदेशों का उपयोग किया और this page से सहायता की और उन्हें माइग्रेशन फ़ाइलों में डाल दिया।

1. टर्मिनल, प्रकार में:

rails g migration CreateJobIdSequence 
rails g migration AddJobIdSequenceToScores 

2. संपादित प्रवास फ़ाइलें इस प्रकार है: ये कदम हैं

20140709181616_create_job_id_sequence.rb:

class CreateJobIdSequence < ActiveRecord::Migration 
    def up 
    execute <<-SQL 
     CREATE SEQUENCE job_id_seq; 
    SQL 
    end 

    def down 
    execute <<-SQL 
     DROP SEQUENCE job_id_seq; 
    SQL 
    end 
end 

20140709182313_add_job_id_sequence_to_scores .rb:

class AddJobIdSequenceToScores < ActiveRecord::Migration 
    def up 
    execute <<-SQL 
     ALTER SEQUENCE job_id_seq OWNED BY scores.job_id; 
     ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('job_id_seq'); 
    SQL 
    end 

    def down 
    execute <<-SQL 
     ALTER SEQUENCE job_id_seq OWNED BY NONE; 
     ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL; 
    SQL 
    end 
end 

3. डेटाबेस में माइग्रेट करें। टर्मिनल प्रकार में:

rake db:migrate 
संबंधित मुद्दे