2010-07-30 15 views
99

के संयोजन के लिए अद्वितीय बाधा जोड़ने के लिए एक माइग्रेशन मुझे कॉलम के संयोजन के लिए अद्वितीय बाधा लागू करने के लिए माइग्रेशन की आवश्यकता है। यानी people तालिका के लिए, first_name, last_Name और Dob का संयोजन अद्वितीय होना चाहिए।कॉलम

उत्तर

185

add_index :people, [:firstname, :lastname, :dob], :unique => true

+7

मुझे लगता है कि एक अद्वितीय इंडेक्स जोड़ रहा है, * नहीं * एक बाधा। या सूचकांक बाधा भी जोड़ता है? –

+13

नहीं, यह सब अच्छा है। मेरी गलती! अद्वितीय बाधा अद्वितीय सूचकांक के साथ आता है। –

+5

मैं @ पॉल-कैंट्रेल से सहमत हूं: केवल एक बाधा जोड़ने के लिए कोई तरीका नहीं है, एक सूचकांक (जिसमें डीबी स्टोरेज प्रभाव है) –

5

हाय आप अद्वितीय सूचकांक अपने प्रवास में कॉलम के उदाहरण

add_index(:accounts, [:branch_id, :party_id], :unique => true) 

या अलग अद्वितीय अनुक्रमणिका के लिए प्रत्येक स्तंभ के लिए जोड़ सकते हैं

+0

क्षमा करें, यह काम किया, पहले मैं संपादन और मौजूदा माइग्रेशन जो काम नहीं किया द्वारा की कोशिश की, फिर एक नया जोड़ा और यह काम किया, धन्यवाद। – rangalo

12

आप एक के बिना एक बाधा जोड़ सकते हैं सूचकांक। यह इस बात पर निर्भर करेगा कि आप किस डेटाबेस का उपयोग कर रहे हैं। पोस्टग्रेज़ के लिए नीचे नमूना माइग्रेशन कोड है। (tracking_number, carrier) उन स्तंभों की एक सूची है जिन्हें आप बाधा के लिए उपयोग करना चाहते हैं।

class AddUniqeConstraintToShipments < ActiveRecord::Migration 
    def up 
    execute <<-SQL 
     alter table shipments 
     add constraint shipment_tracking_number unique (tracking_number, carrier); 
    SQL 
    end 

    def down 
    execute <<-SQL 
     alter table shipments 
     drop constraint if exists shipment_tracking_number; 
    SQL 
    end 
end 

अलग-अलग बाधाएं आप जोड़ सकते हैं। Read the docs

+9

[पोस्टग्रेएसक्यूएल 9.4 के लिए डॉक्स] (http://www.postgresql.org/docs/9.4/static/ddl-constraints.html#DDL-CONSTRAINTS-UNIQUE- कंसस्ट्रेंट्स) कहते हैं: _ एक अद्वितीय बाधा जोड़ने से स्वचालित रूप से एक अद्वितीय btree बन जाएगा बाधा में इस्तेमाल कॉलम या स्तंभों के समूह पर सूचकांक। आंशिक अनुक्रमणिका बनाकर केवल कुछ पंक्तियों पर एक विशिष्टता बाधा लागू की जा सकती है ._ तो आईएमएचओ को कच्चे एसक्यूएल को छोड़ने की कोई आवश्यकता नहीं है जब परिणाम मूल रूप से 'add_index' विधि का उपयोग करने जैसा ही होगा। ;) –

+3

असल में एक कारण है: यह एक कार्यान्वयन विस्तार और [डॉक्स] (http://www.postgresql.org/docs/9.3/static/indexes-unique.html) द्वारा निराश है। यह भी ध्यान रखें कि आप बाध्यता को नाम से संदर्भित नहीं कर सकते हैं, क्योंकि इसे 'pg_constraint' तालिका में नहीं जोड़ा गया है। – kaikuchn

16

howmanyofme.com के अनुसार, अकेले संयुक्त राज्य अमेरिका में "जॉन स्मिथ नामक 46,427 लोग हैं"। यह लगभग 127 साल है। चूंकि यह मनुष्य के औसत जीवनकाल पर अच्छा है, इसका मतलब है कि एक डीओबी संघर्ष गणितीय रूप से निश्चित है।

मैं बस इतना कह रहा हूं कि अद्वितीय क्षेत्रों के उस विशेष संयोजन से भविष्य में अत्यधिक उपयोगकर्ता/ग्राहक निराशा हो सकती है।

कुछ ऐसा मानें जो वास्तव में अनोखा है, राष्ट्रीय पहचान संख्या की तरह, यदि उपयुक्त हो।

(मुझे लगता है मैं इस एक के साथ पार्टी के लिए बहुत देर हो रही है, लेकिन यह भविष्य पाठकों मदद कर सकता है।)

+1

एचआरएम ... आप निश्चित रूप से सही हैं। लेकिन शायद यह सिर्फ एक उदाहरण था कि इयान सिर्फ प्रश्न को स्पष्ट करने के लिए क्या करना चाहता था। – eritiro

+0

शायद। हालांकि इयान के लिए जवाब इरादा नहीं था। या वास्तव में रंगलो। –

1

उपयोगकर्ताओं और पोस्ट के बीच एक मेज में शामिल होने का विशिष्ट उदाहरण में:

create_table :users 
create_table :posts 

create_table :ownerships do |t| 
    t.belongs_to :user, foreign_key: true, null: false 
    t.belongs_to :post, foreign_key: true, null: false 
end 

add_index :ownerships, [:user_id, :post_id], unique: true 

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id" 
DETAIL: Key (user_id, post_id)=(1, 1) already exists. 
: INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id" 

जैसे:

इसी तरह के दो रिकॉर्ड बनाने के लिए एक डेटाबेस त्रुटि (मेरे मामले में Postgres) फेंक जाएगा कोशिश कर रहा है कर रही:

Ownership.create!(user_id: user_id, post_id: post_id) 
Ownership.create!(user_id: user_id, post_id: post_id) 

पूरी तरह से runnable उदाहरण: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced

db/schema.rb उत्पन्न: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a