কলামগুলির সংমিশ্রণে অনন্য বাধা যুক্ত করার জন্য স্থানান্তর


140

কলামগুলির সংমিশ্রণে অনন্য সীমাবদ্ধতা প্রয়োগ করার জন্য আমার যা প্রয়োজন তা হ'ল ration একটি জন্য অর্থাৎ peopleটেবিল সংমিশ্রণ first_name, last_Nameএবং Dobঅনন্য হওয়া উচিত।

উত্তর:


242

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


12
আমি মনে করি যে এর একটি অনন্য সূচক যোগ না একটি বাধ্যতা। নাকি সূচকটিও বাধা যুক্ত করে?
পল কেন্ট্রেল

16
নাহ, সব ঠিক আছে। আমার খারাপ! অনন্য সীমাবদ্ধতা আসে অনন্য সূচকের সাথে।
পল ক্যান্ট্রেল

7
আমি @ পল-ক্যান্ট্রেলের সাথে একমত: কেবলমাত্র বাধা যুক্ত করার কোনও উপায় নেই, কোনও সূচক নয় (যার ডিবি স্টোরেজ প্রভাব রয়েছে)
আগস্টিন রিডঞ্জার

17
মডেল স্তরের যাচাইকরণের সমস্যাটি এটি স্কেল করে না। দুটি সার্ভার একই সময়ে একই ডেটা চালাতে পারে (এপিআই ভারী অ্যাপ্লিকেশনটিতে ডাবল ট্যাপের মতো) আমার
ডিবায়

6
আমি উভয়ই রাখতে চাই .. কেবল তা নিশ্চিত করতে
baash05

25

হাওম্যানিওফমে ডটকমের তথ্য অনুসারে, শুধুমাত্র যুক্তরাষ্ট্রে "জন স্মিথ নামে 46,427 জন লোক রয়েছে"। এটি প্রায় 127 বছর দিন। যেহেতু এটি একটি মানুষের গড় জীবনকালকে ভালভাবে বোঝায়, এর অর্থ একটি ডিওবি সংঘর্ষ গণিতগতভাবে নিশ্চিত।

আমি যা বলছি তা হ'ল সেই অনন্য ক্ষেত্রগুলির নির্দিষ্ট মিশ্রণটি ভবিষ্যতে চরম ব্যবহারকারী / গ্রাহকের হতাশার দিকে পরিচালিত করতে পারে।

যথাযথভাবে জাতীয় পরিচয় সংখ্যা হিসাবে, এমনটি যা অনন্য তা বিবেচনা করুন।

(আমি বুঝতে পারি যে এই একটি নিয়ে আমি পার্টিতে খুব দেরি করেছি, তবে এটি ভবিষ্যতের পাঠকদের সহায়তা করতে পারে))


3
এইচআরএম ... আপনি অবশ্যই ঠিক বলেছেন। তবে সম্ভবত প্রশ্নটি স্পষ্ট করতে ইয়ান কী করতে চেয়েছিল এটির একটি উদাহরণ ছিল।
ইরিতিরো

1
হতে পারে. উত্তরটি যদিও আয়ানের উদ্দেশ্যে করা হয়নি। বা সত্যিই রাঙালো al
একটি ফাদার অন্ধকারে

এটি কেবল ইয়ান বা রাঙ্গালো নয়, সকল ফু-এসের উদ্দেশ্যে ছিল intended
আরকে

20

আপনি কোনও সূচি ছাড়াই বাধা যুক্ত করতে চাইতে পারেন want আপনি কোন ডাটাবেস ব্যবহার করছেন তার উপর এটি নির্ভর করবে। নীচে পোস্টগ্রিসের জন্য নমুনা স্থানান্তর কোড রয়েছে। (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
PostgreSQL 9.4 এর জন্য ডকস বলেছেন: একটি অনন্য সীমাবদ্ধতা সংযোজনে ব্যবহৃত সীমাবদ্ধতায় ব্যবহৃত কলাম বা কলামের গোষ্ঠীতে স্বয়ংক্রিয়ভাবে একটি অনন্য বিট্রি সূচক তৈরি করবে। আংশিক সূচক তৈরি করে কেবল কয়েকটি সারিতে একটি স্বতন্ত্রতা বাধা প্রয়োগ করা যেতে পারে। সুতরাং আইএমএইচও-র কাঁচা এসকিউএল নেওয়ার দরকার নেই যখন ফলাফলটি মূলত add_indexপদ্ধতিটি ব্যবহারের মতো হবে । ;)
রাফাł সিইলাক

8
প্রকৃতপক্ষে একটি কারণ রয়েছে: এটি বাস্তবায়নের বিশদ এবং ডক্স দ্বারা নিরুৎসাহিত । এছাড়াও নোট করুন যে আপনি নাম দ্বারা সীমাবদ্ধতা উল্লেখ করতে পারবেন না, যেহেতু এটি pg_constraintটেবিলে যুক্ত করা হয়নি ।
কায়কুচন

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/9d641ca78dad8eb64736173614d97ced

db/schema.rbউত্পন্ন: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a


4

সম্পূর্ণতার জন্য এবং বিভ্রান্তি এড়াতে এখানে একই জিনিস করার 3 টি উপায়:
রেল 5.2+ এ কলামগুলির সংমিশ্রণে একটি নামযুক্ত অনন্য সীমাবদ্ধতা যুক্ত করা

ধরা যাক আমাদের কাছে অবস্থানের টেবিল রয়েছে যা কোনও বিজ্ঞাপনদাতার অন্তর্ভুক্ত এবং কলাম রেফারেন্স_ কোড রয়েছে এবং আপনি বিজ্ঞাপনদাতাকে কেবল 1 রেফারেন্স কোড চান code সুতরাং আপনি কলামগুলির সংমিশ্রণে একটি অনন্য বাধা যুক্ত করতে এবং এটির নাম রাখতে চান।

না:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.