মাইএসকিউএল প্রাথমিক কী আপডেট করা হচ্ছে


106

আমার user_interactions4 টি কলাম সহ একটি টেবিল রয়েছে:

 user_1
 user_2
 type
 timestamp

প্রাথমিক কীটি (user_1,user_2,type)
এবং আমি এতে পরিবর্তন করতে চাই to(user_2,user_1,type)

সুতরাং আমি যা করেছি তা হ'ল:

drop primary key ...  
add primary key (user_2,user_1,type)...

এবং ভয়েলা ...

সমস্যাটি হ'ল ডাটাবেসটি একটি সার্ভারে লাইভ।

সুতরাং আমি প্রাথমিক কী আপডেট করার আগে অনেক নকল ইতিমধ্যে ক্রিপ্ট হয়েছিল এবং সেগুলি ক্রমাগত ক্রাইপিংয়ে চলেছে।

কি করো?

আমি এখন যা করতে চাই তা হ'ল ডুপ্লিকেটগুলি মুছে ফেলা এবং সর্বশেষের সাথে রাখা timestamp(যা টেবিলের একটি কলাম)।

এবং তারপরে কোনওভাবে পুনরায় প্রাথমিক কী আপডেট করুন।


17
আমি আমার শ্বাসের নিচে অভিশপ্ত প্রত্যেকটি ডিবিএর জন্য হঠাৎ খারাপ অনুভব করি ...
Ignacio Vazquez-Abram

5
পরের
বারে

4
@ ইগনাসিও, এটি একটি সার্ভারে লাইভ, তবে এটি একটি ব্যাকআপ-ব্যাকআপ সার্ভার :-)। আমি ডিবিএ নই, তবে আমি এই বিষয়টিকে
সত্যই

4
@ কেটিটল, হ্যাঁ আমি এখন যা ভেবেছিলাম তা খুব দেরীতে হলেও :-)
সিম্পলফুজ

4
@ পিক্সলাইন: এটি একটি যৌগিক প্রাথমিক কী।
ইগনাসিও ওয়াজকেজ-আব্রামস

উত্তর:


238

পরের বার, প্রাথমিক কী আপডেট করতে একটি একক "অল্টার টেবিল" স্টেটমেন্ট ব্যবহার করুন।

alter table xx drop primary key, add primary key(k1, k2, k3);

জিনিস ঠিক করতে:

create table fixit (user_2, user_1, type, timestamp, n, primary key( user_2, user_1, type) );
lock table fixit write, user_interactions u write, user_interactions write;

insert into fixit 
select user_2, user_1, type, max(timestamp), count(*) n from user_interactions u 
group by user_2, user_1, type
having n > 1;

delete u from user_interactions u, fixit 
where fixit.user_2 = u.user_2 
  and fixit.user_1 = u.user_1 
  and fixit.type = u.type 
  and fixit.timestamp != u.timestamp;

alter table user_interactions add primary key (user_2, user_1, type );

unlock tables;

আপনি যখন এটি করছেন তখন লকটির আরও আপডেট আসা বন্ধ করা উচিত। এটি কতক্ষণ সময় নেয় তা আপনার টেবিলের আকারের উপর নির্ভর করে।

মূল সমস্যাটি হ'ল যদি একই টাইমস্ট্যাম্পের সাথে আপনার কিছু নকল থাকে।


11

প্রাথমিক কীটি যদি একটি অটো_সংশোধনের মান হিসাবে দেখা যায়, আপনাকে অটো বর্ধন সরিয়ে ফেলতে হবে, তারপরে প্রাথমিক কীটি ফেলে ফেলুন এবং তারপরে পুনরায় যুক্ত করুন স্বয়ংক্রিয় বৃদ্ধি

ALTER TABLE `xx`
MODIFY `auto_increment_field` INT, 
DROP PRIMARY KEY, 
ADD PRIMARY KEY (new_primary_key);

তারপরে স্বয়ংক্রিয় বৃদ্ধি বৃদ্ধি করুন back

ALTER TABLE `xx` ADD INDEX `auto_increment_field` (auto_increment_field),
MODIFY `auto_increment_field` int auto_increment;

তারপরে স্বতঃবৃদ্ধি পূর্ববর্তী মানটিতে ফিরে আসুন

ALTER TABLE `xx` AUTO_INCREMENT = 5;

2

আপনি IGNOREকীওয়ার্ডটিও ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

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