स्तंभों के संयोजन में अद्वितीय बाधा जोड़ने के लिए एक प्रवास


140

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

जवाबों:


243

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


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

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

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

17
मॉडल स्तर सत्यापन के साथ समस्या यह है कि यह पैमाने पर नहीं है। दो सर्वर एक ही समय में (एपीपी हैवी ऐप पर एक डबल टैप की तरह) के माध्यम से एक ही डेटा चला सकते हैं। अभी मेरे DB में दो समान रिकॉर्ड हैं और मॉडल की मान्यता है ..
baash05

6
मुझे दोनों पसंद हैं .. बस सुनिश्चित करने के लिए
baash05

25

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

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

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

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


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

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

यह सभी फू-एस के लिए था, केवल इयान या रंगालो के लिए नहीं।
ARK

21

आप एक सूचकांक के बिना एक बाधा जोड़ना चाहते हो सकता है। यह इस बात पर निर्भर करेगा कि आप किस डेटाबेस का उपयोग कर रहे हैं। नीचे Postgres के लिए नमूना माइग्रेशन कोड है। (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

विभिन्न बाधाएं हैं जिन्हें आप जोड़ सकते हैं। डॉक्स पढ़ें


12
पोस्टग्रेएसक्यूएल 9.4 के लिए डॉक्स कहते हैं: एक अद्वितीय बाधा को जोड़ने से स्वचालित रूप से बाधा में उपयोग किए गए कॉलम या कॉलम के समूह पर एक अद्वितीय बीटीआरई सूचकांक बन जाएगा। केवल कुछ पंक्तियों पर एक विशिष्ट बाधा एक आंशिक सूचकांक बनाकर लागू की जा सकती है। इसलिए IMHO को कच्चे SQL को छोड़ने की कोई आवश्यकता नहीं है जब परिणाम मूल रूप से add_indexविधि का उपयोग करने के समान होगा । ;)
राफेल सिलेक

8
वास्तव में एक कारण है: यह डॉक्स द्वारा एक कार्यान्वयन विवरण और हतोत्साहित किया जाता है । यह भी ध्यान दें कि आप नाम से बाधा का उल्लेख नहीं कर सकते, क्योंकि यह pg_constraintतालिका में नहीं जोड़ा गया है ।
kaikuchn

8

नमस्ते, उदाहरण के लिए आप अपने प्रवास में अद्वितीय सूचकांक जोड़ सकते हैं

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

या प्रत्येक कॉलम के लिए अलग-अलग यूनीक इंडेक्स


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

4

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

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"

उदाहरण के लिए:

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

पूरी तरह से चलने योग्य उदाहरण: https://gist.github.com/Dorian/9d641ca78dad8eb6473617363614d97ced

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


4

पूर्णता के लिए, और भ्रम से बचने के लिए यहां एक ही काम करने के 3 तरीके हैं:
रेल नामकरण में स्तंभों के संयोजन के लिए एक अद्वितीय बाधा नाम जोड़ना 5.2+

मान लें कि हमारे पास स्थान तालिका है जो एक विज्ञापनदाता से संबंधित है और इसमें स्तंभ संदर्भ_कोड है और आप प्रति विज्ञापनदाता केवल 1 संदर्भ कोड चाहते हैं। इसलिए आप स्तंभों के संयोजन में एक अद्वितीय बाधा जोड़ना चाहते हैं और इसे नाम देते हैं।

करना:

rails g migration AddUniquenessConstraintToLocations

और अपने माइग्रेशन को या तो इस लाइनर की तरह बनाएं:

class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
  def change
    add_index :locations, [:reference_code, :advertiser_id], unique: true, name: 'uniq_reference_code_per_advertiser'
  end
end

या यह ब्लॉक संस्करण।

class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
  def change
    change_table :locations do |t|
     t.index ['reference_code', 'advertiser_id'], name: 'uniq_reference_code_per_advertiser', unique: true
    end
  end
end

या यह कच्चा एसक्यूएल संस्करण

class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
  def change
      execute <<-SQL
          ALTER TABLE locations
            ADD CONSTRAINT uniq_reference_code_per_advertiser UNIQUE (reference_code, advertiser_id);
        SQL
  end
end

इनमें से किसी का भी परिणाम समान होगा, अपनी जांच करें schema.rb

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.