মাইএসকিউএল টেবিলগুলিতে সদৃশ মুছে ফেলা একটি সাধারণ সমস্যা, যা হাতের আগে সেই সদৃশগুলি এড়ানোর জন্য জেনারিকভাবে অনুপস্থিত প্রতিবন্ধকতার ফলাফল। তবে এই সাধারণ সমস্যাটি সাধারণত নির্দিষ্ট প্রয়োজনগুলির সাথে আসে ... যার জন্য নির্দিষ্ট পদ্ধতির প্রয়োজন হয়। পদ্ধতির উপর নির্ভর করে ভিন্ন হওয়া উচিত, উদাহরণস্বরূপ, ডেটার আকার, ডুপ্লিকেট এন্ট্রি যা রাখা উচিত (সাধারণত প্রথম বা শেষ একটি), সেখানে সূচি রাখতে হবে কিনা, বা আমরা কোনও অতিরিক্ত সম্পাদন করতে চাই কিনা সদৃশ তথ্য উপর ক্রিয়া।
মাইএসকিউএল-তে নিজেও কিছু বৈশিষ্ট্য রয়েছে যেমন কোনও টেবিল আপডেটের সময় এটি কোনও ফর্মের কারণে একই টেবিলটি উল্লেখ করতে সক্ষম না হওয়া (এটি মাইএসকিউএল ত্রুটি # 1093 বাড়িয়ে তুলবে)। এই সীমাবদ্ধতা অস্থায়ী টেবিল (উপরের কিছু পদ্ধতির পরামর্শ হিসাবে) দিয়ে অভ্যন্তরীণ কোয়েরি ব্যবহার করে কাটিয়ে উঠতে পারে। তবে বড় ডেটা উত্সগুলির সাথে কাজ করার সময় এই অভ্যন্তরীণ কোয়েরিটি বিশেষভাবে ভাল সম্পাদন করবে না।
তবে সদৃশ অপসারণের জন্য আরও ভাল পদ্ধতির উপস্থিতি রয়েছে, এটি দক্ষ এবং নির্ভরযোগ্য উভয়ই এবং এটি সহজেই বিভিন্ন প্রয়োজনের সাথে মানিয়ে নেওয়া যায়।
সাধারণ ধারণাটি হ'ল একটি নতুন অস্থায়ী টেবিল তৈরি করা, সাধারণত আরও অনুলিপিগুলি এড়ানোর জন্য একটি অনন্য বাধা যুক্ত করা এবং নকলগুলির যত্ন নেওয়ার সময় আপনার পূর্বের টেবিল থেকে ডেটা নতুনটিতে সন্নিবেশ করানো। এই পদ্ধতির সহজ মাইএসকিউএল INSERT প্রশ্নের উপর নির্ভর করে, আরও নকলগুলি এড়ানোর জন্য একটি নতুন প্রতিবন্ধকতা তৈরি করে এবং সদৃশ সন্ধান করার জন্য একটি অভ্যন্তরীণ কোয়েরি ব্যবহারের প্রয়োজন এবং স্মৃতিতে রাখা উচিত এমন একটি অস্থায়ী টেবিল (এগুলি বড় ডেটা উত্সগুলিও ফিট করে) ips
এভাবেই এটি অর্জন করা যায়। নিম্নলিখিত কলামগুলি সহ আমাদের একটি টেবিল কর্মচারী রয়েছে:
employee (id, first_name, last_name, start_date, ssn)
ডুপ্লিকেট এসএসএন কলামের সাহায্যে সারিগুলি মুছতে এবং কেবল প্রথম এন্ট্রি পাওয়া গেছে, নিম্নলিখিত প্রক্রিয়াটি অনুসরণ করা যেতে পারে:
-- create a new tmp_eployee table
CREATE TABLE tmp_employee LIKE employee;
-- add a unique constraint
ALTER TABLE tmp_employee ADD UNIQUE(ssn);
-- scan over the employee table to insert employee entries
INSERT IGNORE INTO tmp_employee SELECT * FROM employee ORDER BY id;
-- rename tables
RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
প্রযুক্তিগত ব্যাখ্যা
- লাইন # 1 কর্মচারী টেবিলের ঠিক একই কাঠামো সহ একটি নতুন tmp_eployee টেবিল তৈরি করে
- লাইন # 2 আরও নকল এড়াতে নতুন tmp_eployee টেবিলের জন্য একটি অনন্য বাধা যুক্ত করে
- আইডি দ্বারা লাইন # 3 আসল কর্মচারী টেবিলের উপরে স্ক্যান করে , ডুপ্লিকেটড এন্ট্রিগুলি উপেক্ষা করার সময়, নতুন টিএমপি_প্লোয়ে টেবিলটিতে নতুন কর্মচারী প্রবেশ সন্নিবেশ করানো হবে
- লাইন # 4 টেবিলগুলির নাম পরিবর্তন করে, যাতে নতুন কর্মচারী টেবিলটি নকল ছাড়াই সমস্ত এন্ট্রি ধারণ করে এবং পূর্ববর্তী ডেটার একটি ব্যাকআপ অনুলিপি ব্যাকআপ_এম্পলয়ে টেবিলে রাখা হয়
⇒ এই পদ্ধতির ব্যবহার করে, 1.6m রেজিস্টার 200s কম সময়ে 6k রূপান্তরিত করা হয়েছে।
চেতান , এই প্রক্রিয়াটি অনুসরণ করে, আপনি দ্রুত এবং সহজেই আপনার সমস্ত নকল মুছে ফেলতে এবং চালিয়ে একটি অনন্য বাধা তৈরি করতে পারেন:
CREATE TABLE tmp_jobs LIKE jobs;
ALTER TABLE tmp_jobs ADD UNIQUE(site_id, title, company);
INSERT IGNORE INTO tmp_jobs SELECT * FROM jobs ORDER BY id;
RENAME TABLE jobs TO backup_jobs, tmp_jobs TO jobs;
অবশ্যই, নকল মুছে ফেলার সময় এই প্রক্রিয়াটিকে আরও বিভিন্ন প্রয়োজনের সাথে খাপ খাইবার জন্য আরও সংশোধন করা যেতে পারে। কিছু উদাহরণ অনুসরণ।
Entry প্রথম প্রবেশের পরিবর্তে শেষ এন্ট্রি রাখার জন্য পার্থক্য
কখনও কখনও আমাদের প্রথমটির পরিবর্তে শেষ সদৃশ এন্ট্রি রাখা প্রয়োজন।
CREATE TABLE tmp_employee LIKE employee;
ALTER TABLE tmp_employee ADD UNIQUE(ssn);
INSERT IGNORE INTO tmp_employee SELECT * FROM employee ORDER BY id DESC;
RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
- # 3 লাইনে, অর্ডার বাই আইডি ডিইএসসি ক্লজটি সর্বশেষ আইডির বাকী অংশগুলির চেয়ে অগ্রাধিকার পেতে দেয়
D সদৃশগুলিতে কিছু কাজ সম্পাদনের জন্য বৈকল্পিকতা, উদাহরণস্বরূপ পাওয়া নকলগুলিতে একটি গণনা রাখা
কখনও কখনও আমাদের পাওয়া নকল প্রবেশগুলি (যেমন ডুপ্লিকেটগুলির একটি গণনা রাখা) সম্পর্কে আরও কিছু প্রক্রিয়াজাতকরণ করা দরকার।
CREATE TABLE tmp_employee LIKE employee;
ALTER TABLE tmp_employee ADD UNIQUE(ssn);
ALTER TABLE tmp_employee ADD COLUMN n_duplicates INT DEFAULT 0;
INSERT INTO tmp_employee SELECT * FROM employee ORDER BY id ON DUPLICATE KEY UPDATE n_duplicates=n_duplicates+1;
RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
- লাইন # 3 এ, একটি নতুন কলাম n_ নকল তৈরি করা হয়েছে
- লাইন # 4-তে, সন্নিবেশটি অন্তর্ভুক্ত করুন ... অনুলিপি কী আপডেটের সাথে অনুসন্ধানের কোনও ডুপ্লিকেট পাওয়া গেলে একটি অতিরিক্ত আপডেট করতে ব্যবহৃত হয় (এই ক্ষেত্রে, একটি কাউন্টার বাড়ানো হচ্ছে) INSERT INTO ... DUPLICATE KEY আপডেটের ক্যোয়ারী হতে পারে পাওয়া নকলের জন্য বিভিন্ন ধরণের আপডেট করতে ব্যবহৃত হয়।
The অটো-ইনক্রিমেন্টাল ফিল্ড আইডি পুনরায় জন্মানোর জন্য পার্থক্য
কখনও কখনও আমরা একটি অটো-ইনক্রিমেন্টাল ক্ষেত্র ব্যবহার করি এবং সূচকটিকে যথাসম্ভব কমপ্যাক্ট রাখার জন্য, আমরা অস্থায়ী সারণীতে স্বয়ংক্রিয়-বর্ধিত ক্ষেত্রটি পুনঃজুনাতে ডুপ্লিকেটগুলি মুছে ফেলার সুবিধা নিতে পারি।
CREATE TABLE tmp_employee LIKE employee;
ALTER TABLE tmp_employee ADD UNIQUE(ssn);
INSERT IGNORE INTO tmp_employee SELECT (first_name, last_name, start_date, ssn) FROM employee ORDER BY id;
RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
- লাইন # 3 তে, টেবিলের সমস্ত ক্ষেত্র নির্বাচন করার পরিবর্তে, আইডি ফিল্ডটি এড়িয়ে যায় যাতে ডিবি ইঞ্জিন স্বয়ংক্রিয়ভাবে একটি নতুন তৈরি করে
✔ আরও বিভিন্নতা
পছন্দসই আচরণের উপর নির্ভর করে আরও অনেকগুলি পরিবর্তনও করণীয়। উদাহরণস্বরূপ, নীচের প্রশ্নাগুলি দ্বিতীয় অস্থায়ী টেবিলটি ব্যবহার করবে, 1) এর পরিবর্তে প্রথমটির পরিবর্তে শেষ এন্ট্রি রাখবে; এবং 2) পাওয়া নকলগুলিতে একটি পাল্টা বাড়ান; এছাড়াও 3) প্রাক্তন ডেটা যেমন ছিল তেমন প্রবেশের আদেশ রাখার সময় অটো-ইনক্রিমেন্টাল ফিল্ড আইডি পুনরায় জেনারেট করুন।
CREATE TABLE tmp_employee LIKE employee;
ALTER TABLE tmp_employee ADD UNIQUE(ssn);
ALTER TABLE tmp_employee ADD COLUMN n_duplicates INT DEFAULT 0;
INSERT INTO tmp_employee SELECT * FROM employee ORDER BY id DESC ON DUPLICATE KEY UPDATE n_duplicates=n_duplicates+1;
CREATE TABLE tmp_employee2 LIKE tmp_employee;
INSERT INTO tmp_employee2 SELECT (first_name, last_name, start_date, ssn) FROM tmp_employee ORDER BY id;
DROP TABLE tmp_employee;
RENAME TABLE employee TO backup_employee, tmp_employee2 TO employee;