ইতিমধ্যে বিদ্যমান রেলগুলি স্বতঃ-বরাদ্দ ID


93

আমি এর মতো একটি নতুন রেকর্ড তৈরি করি:

truck = Truck.create(:name=>name, :user_id=>2)

আমার ডাটাবেসে বর্তমানে ট্রাকের জন্য কয়েক হাজার সত্ত্বা রয়েছে, তবে আমি আইডিটি বেশিরভাগের কাছে অর্পণ করেছি, যাতে কিছু আইডি পাওয়া যায়। সুতরাং যা ঘটছে তা হল রেলগুলি আইডি = 150 দিয়ে আইটেম তৈরি করে এবং এটি দুর্দান্ত কাজ করে। তবে তারপরে এটি একটি আইটেম তৈরি করে এটিকে = 151 নির্ধারণের চেষ্টা করে তবে সেই আইডি ইতিমধ্যে উপস্থিত থাকতে পারে, তাই আমি এই ত্রুটিটি দেখছি:

ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey" DETAIL: Key (id)=(151) already exists.

এবং পরের বার আমি অ্যাকশনটি চালাচ্ছি, এটি কেবল 152 আইডিটি অর্পণ করবে, যা যদি ইতিমধ্যে মানটি না নেওয়া হয় তবে তা ঠিক কাজ করবে। কোনও আইডি নির্ধারিত হওয়ার আগেই এটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করার জন্য আমি কীভাবে রেল পেতে পারি?

ধন্যবাদ!

সম্পাদনা

ট্রাক আইডি হ'ল নকল করা হচ্ছে। ব্যবহারকারী ইতিমধ্যে বিদ্যমান এবং এই ক্ষেত্রে একটি ধ্রুবক। এটি আসলে একটি উত্তরাধিকার বিষয় যা আমাকে মোকাবেলা করতে হবে। একটি বিকল্প হ'ল, টেবিলটি পুনরায় তৈরি করা যাক রেলগুলি অটোকে প্রতিটি আইডি প্রায় সময় নির্ধারণ করুন। আমি ভাবতে শুরু করেছি এটি সেরা পছন্দ হতে পারে কারণ আমার আরও কয়েকটি সমস্যা রয়েছে, তবে এটি করার জন্য স্থানান্তর খুব জটিল হবে কারণ অন্যান্য অনেক সারণীতে ট্রাক একটি বিদেশী কী। অটল-নির্ধারিত আইডি সহ এবং বিদ্যমান সমস্ত সম্পর্ক বজায় রেখে ট্রামের মধ্যে ইতিমধ্যে সঞ্চিত একই ডেটা দিয়ে রেলগুলি একটি নতুন টেবিল তৈরি করার সহজ উপায় হতে পারে?


আপনি কেন রেলগুলিকে স্বয়ংক্রিয়ভাবে আইডি নির্ধারণ করতে দিচ্ছেন না? এটি সদৃশ হওয়ার যে কোনও বিপদকে দূর করবে - বা এটি কোনও উত্তরাধিকার সূত্রের ডেটা ইস্যু যেখানে আপনার পুরানো আইডি রাখতে হবে? কোনও নতুন বিষয় তৈরি করার সময় এটি ব্যবসায়ের মতো স্বাভাবিক না হওয়ায় কেবল ব্যবসায়ের ক্ষেত্রে কিছুটা বুঝতে চাই।
এমবিএনওয়াইওয়াইসি

@ এমবিএইচএনওয়াইসি আমার ধারণা যে, ডি-নিস সংস্থা তৈরি করার সময় একটি ইউজার_আইড বরাদ্দ করছে, এবং আপনি যেমন ভাবছেন তেমন আইডি নয় (এবং আমিও এক মুহুর্তের জন্য করেছি)।
অনিল

খুব ভাল অনিল - আপনি পুরোপুরি ঠিক বলেছেন। @ ডি-নাইস, সম্ভবত কিছু পোস্ট করার ক্ষেত্রে এই টেবিলটির জন্য আপনার মাইগ্রেশনটি আপনার পোস্টে যুক্ত করুন? বিভ্রান্তি দূর করতে সেই ব্যবহারকারী_আইডি সম্পাদনা করার
লোভনীয়

না, দুঃখিত এটি অস্পষ্ট ছিল, কোম্পানির আইডি হ'ল নকল করা হচ্ছে। ব্যবহারকারী ইতিমধ্যে বিদ্যমান এবং এই ক্ষেত্রে একটি ধ্রুবক। এটি আসলে একটি উত্তরাধিকার বিষয় যা আমাকে মোকাবেলা করতে হবে। আরও তথ্যের সাথে পোস্ট সম্পাদনা করবে
D-Nice

আপনার টেবিলটি পুনরায় তৈরি করার দরকার নেই। ক্রমটি পুনরায় সেট করতে আমার উত্তরটি দেখুন।
দন্ডী মাইকেল স্ট্রোমা

উত্তর:


88

রেলগুলি সম্ভবত অন্তর্নির্মিত পোস্টগ্রিজ এসকিউএল ক্রম ব্যবহার করছে। সিকোয়েন্সের ধারণাটি হ'ল এটি কেবল একবার ব্যবহার করা হয়।

সবচেয়ে সহজ সমাধানটি হ'ল আপনার কোম্পানির ক্রম সেট করুন। এই জাতীয় একটি ক্যোরির সাথে সারণি সর্বাধিক মান হিসাবে কলাম করুন:

SELECT setval('company_id_seq', (SELECT max(id) FROM company));

আমি আপনার অনুক্রমের নাম "Company_id_seq", টেবিলের নাম "সংস্থা", এবং কলামের নাম "আইডি" অনুমান করছি ... দয়া করে এগুলি যথাযথের সাথে প্রতিস্থাপন করুন। আপনি সিকোয়েন্সের নামটি সহ SELECT pg_get_serial_sequence('tablename', 'columname');বা সারণির সংজ্ঞাটি দেখতে পারবেন \d tablename

একটি বিকল্প সমাধান হ'ল সংরক্ষণের আগে নতুন সারিগুলির জন্য ম্যানুয়ালিভাবে সংস্থা আইডি সেট করার জন্য আপনার কোম্পানীর শ্রেণিতে সেভ () পদ্ধতিটি ওভাররাইড করা।


আমি অনুমান করছি যে এটি কী করবে যা বর্তমানে সর্বাধিক মান +1 এর সাথে অটো-এসাইনিং শুরু হবে?
ডি নিস

আমি মনে করি এটি আমার প্রশ্নের সেরা উত্তর, তবে, সম্পর্কহীন কারণে আমাকে আমার ওপি সম্পাদনাতে বর্ণিত কৌশলটি ব্যবহার করার উপায় খুঁজে বের করতে হবে
ডি-নাইস

আমি বুঝতে পারছি না কেন এটি শুরু হয়েছিল? এটি আমার ক্ষেত্রে ঘটেছে এবং আমি বুঝতে চাই যে এটি কীভাবে সম্ভব।
হান্ট বার্ডিক

4
@ ওয়েবেসাইটসনেস, যদি পোস্টগ্রেএসকিউএল-এর একটি সিরিয়াল কলাম থাকে (একটি ক্রমিক কলাম এমন হয় যেখানে ডিফল্ট মানটি একটি অনুক্রমের পরবর্তী মান হয়), তবে সেই কলামটিতে শক্ত মান সহ সারণীটি জনপ্রিয় করে তোলে, ক্রমটি স্বয়ংক্রিয়ভাবে আপডেট হবে না। উদাহরণ: create table t (id serial not null primary key); insert into t values (1); insert into t values (default); ERROR: duplicate key value violates unique constraint "t_pkey" DETAIL: Key (id)=(1) already exists.
দন্ডী মাইকেল স্ট্রোমা

207

আমি এটি করেছি যা আমার জন্য সমস্যাটি সমাধান করেছে।

ActiveRecord::Base.connection.tables.each do |t|
  ActiveRecord::Base.connection.reset_pk_sequence!(t)
end

আমি রিসেট_পিকে_সিকোয়েন্সটি পেয়েছি! এই থ্রেড থেকে http://www.ruby-forum.com/topic/64428


4
ধন্যবাদ, সেরা সমাধান। ডাটাবেস স্থানান্তর করার পরে আমারও একই সমস্যা ছিল।
ওলেগ পাসকো

63
বা ওয়ান-লাইনারের সমতুল্য (রেল কনসোল অনুলিপি / পেস্টের উদ্দেশ্যে):ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) }
রাফ

কীভাবে এই ধারণাটি সিঙ্কের বাইরে চলে যায়?
লম্বা পল

26

@Apie উপর ভিত্তি করে উত্তর

আপনি যখন প্রয়োজন তখন একটি টাস্ক তৈরি করতে এবং চালাতে পারেন:

rake database:correction_seq_id

আপনি এই জাতীয় কাজগুলি তৈরি করুন:

rails g task database correction_seq_id

এবং উত্পন্ন ফাইলটিতে ( lib/tasks/database.rake) লিখুন:

namespace :database do
    desc "Correction of sequences id"
    task correction_seq_id: :environment do
        ActiveRecord::Base.connection.tables.each do |t|
            ActiveRecord::Base.connection.reset_pk_sequence!(t)
        end
    end
end

4

আমার কাছে একটি ডাটাবেস সমস্যা এবং রেলের সমস্যা নয় বলে মনে হচ্ছে। আপনার idকলামে আপনার ডাটাবেসের একটি অনুপযুক্ত পরিচয় বীজ থাকা সম্ভব ? সরাসরি আপনার ডাটাবেসে একটি দম্পতি প্রবেশ করানোর চেষ্টা করে দেখুন এবং একই আচরণ বিদ্যমান কিনা তা দেখুন।


4
ডাউনটা কেন? এটি হ'ল যথাযথ আচরণ যা আপনি যদি আপনার বর্ধিত ক্রমটি অন্য বিদ্যমান মানের চেয়ে কম হয় এবং তাই তথ্য সন্নিবেশ করার সময় মাঝে মধ্যে সংঘর্ষে আঘাত হানেন তবে ঘটে থাকে। পোস্টার ইতিমধ্যে জানিয়েছে যে বিদ্যমান তথ্য রয়েছে যা এই ক্ষেত্রে পড়ে।
mynameiscoffey

আমি জরিমানা canোকাতে পারি। আমি এই ত্রুটিটি পাওয়ার পরে, আমি আবার একই ক্রিয়াটি আবার চালাতে পারি এবং এটি কাজ করতে পারি, যদি সিক্যুয়েন্সের পরবর্তী আইডিটি এখনও না নেওয়া হয়।
ডি নিস

দেখে মনে হচ্ছে এটি আমার পরিস্থিতি ছিল - আমি সমস্যার মধ্যে পড়েছিলাম কিন্তু পরবর্তী রেকর্ডটি আমি fineোকানো ভাল কাজ করেছে, সুতরাং এটি অবশ্যই বীজটিকে সঠিক জায়গায় পেয়েছে।
বেন হুইলার

4

কমান্ড অনুসরণ করে আমি এই সমস্যাটি সমাধান করেছি।

আপনার রেল কনসোলে এটি চালান

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