1 নয়, 2 টি কলামে নকল কীভাবে সন্ধান করবেন


107

আমার কাছে দুটি কলামের সাথে আমার আগ্রহী একটি মাইএসকিউএল ডাটাবেস টেবিল রয়েছে। স্বতন্ত্রভাবে তাদের প্রত্যেকটির নকল থাকতে পারে তবে তাদের দুটি মানের সদৃশ হওয়া উচিত নয়।

stone_idপ্রতিটি upshargeশিরোনাম আলাদা, এবং বিপরীতে হিসাবে ডুপ্লিকেট থাকতে পারে । তবে উদাহরণ হিসাবে বলুন stone_id= 412 এবং upcharge_title= "নীলা" যে সংমিশ্রণটি কেবল একবারই হওয়া উচিত।

এটা ঠিক আছে:

stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"

এটি ঠিক নেই:

stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"

এমন কোনও জিজ্ঞাসা রয়েছে যা উভয় ক্ষেত্রেই সদৃশ খুঁজে পাবে? এবং যদি সম্ভব হয় তবে আমার ডেটা-বেস সেট করার কোনও উপায় কি এটির অনুমতি নেই?

আমি মাইএসকিউএল সংস্করণ ব্যবহার করছি 4.1.22

উত্তর:


192

আপনার দুটি ক্ষেত্রের মধ্যে একটি সমন্বিত কী সেট আপ করা উচিত। এটির জন্য প্রতিটি সারির জন্য একটি অনন্য স্টোন_আইডি এবং আপচার্জ_ টাইটেল লাগবে।

যতদূর বিদ্যমান নকলগুলি খুঁজে পেতে চেষ্টা করুন:

select   stone_id,
         upcharge_title,
         count(*)
from     your_table
group by stone_id,
         upcharge_title
having   count(*) > 1

আপনাকে ধন্যবাদ, এটি তাদের নির্বাচন করে না। আপনি কী আমাকে সদৃশ মুছে ফেলতে (যেমন 1 টি অনুলিপি অবশ্যই রেখে দেবেন) বলার জন্য দয়াবান হতে পারেন ধন্যবাদ!
জেডি আইজ্যাকস

2
একটি উপায় হ'ল সমস্ত স্বতন্ত্র ডেটা গ্রহণ এবং টেবিলটি পুনরায় তৈরি করা।
মিয়াগি কোডার

1
@ জন আইজ্যাকস: যদি এমন কোনও ক্ষেত্র না থাকে যার সাথে আপনি তাদের আলাদা করতে পারেন (যেমন সমস্ত ক্ষেত্রগুলি নকল), তবে আপনাকে উভয় সারি মুছতে হবে এবং একটি পুনরায় তৈরি করতে হবে। একটি উপায় হ'ল টেবিলের অনুলিপিতে অনুলিপিগুলি অনুলিপি করা, সেগুলি আসল থেকে মুছুন এবং অনুলিপিটি থেকে স্বতন্ত্র সারিগুলি পুনরায় সন্নিবেশ করা।
পি বাবা

এটি পোস্টগ্রিজ ৮.১ এ কাজ করে না, কেউ কি আমাকে তাতে হাত দিতে পারে?
লেনন

মহান ধন্যবাদ, আপনি যে বিষয়টি অর্ডার করেন সেটি কি আদেশ করে?
অ্যান্ড্রু

35

আমি "ALTER IGNORE" ব্যবহার করে একটি অকল্য সূচক যুক্ত করা সহায়ক বলে মনে করেছি যা সদৃশগুলি সরিয়ে দেয় এবং অনন্য রেকর্ডগুলি প্রয়োগ করে যা আপনার মনে হয় যা মনে হয়। সুতরাং বাক্য গঠনটি হ'ল:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);

এটি কার্যকরভাবে অনন্য বাধা যুক্ত করে যার অর্থ আপনার কাছে সদৃশ রেকর্ড কখনও থাকবে না এবং আইজিএনওর বিদ্যমান নকলগুলি মুছে ফেলবে।

আপনি আরো পড়তে পারেন সম্পর্কে অঁ্যা ALTER এখানে উপেক্ষা করে: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/

আপডেট: আমাকে @ ইনফিজিটিভ দ্বারা জানানো হয়েছিল যে এটি মাইএসকিউএল> 5.5 এর সংস্করণগুলিতে ব্যর্থ হতে পারে:

এটি মাইএসকিউএল> 5.5 এবং ইনোডিবি টেবিল এবং পারকোনায় তাদের ইনোডিবি দ্রুত সূচক তৈরির বৈশিষ্ট্য [ http://bugs.mysql.com/bug.php?id=40344] এর কারণে ব্যর্থ হয় । এই ক্ষেত্রে প্রথমে রান করুন set session old_alter_table=1এবং তারপরে উপরের কমান্ডটি ঠিকঠাক কাজ করবে

আপডেট - ALTER IGNORE5.7 -এ সরানো হয়েছে

ডক্স থেকে

মাইএসকিউএল 5.6.17 হিসাবে, আইজিএনওর ধারাটি অবচয় করা হয়েছে এবং এর ব্যবহার একটি সতর্কতা উত্পন্ন করে। আইজিএনরে মাইএসকিউএল 5.7-এ সরানো হয়েছে।

মাইএসকিউএল দেবের একটিতে দুটি বিকল্প দেওয়া হয় :

  • অনন্য ক্ষেত্রগুলি দ্বারা গ্রুপ করুন এবং উপরের মত দেখাতে মুছুন
  • একটি নতুন টেবিল তৈরি করুন, একটি অনন্য সূচক যুক্ত করুন, ব্যবহার করুন INSERT IGNORE, প্রাক্তন:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;

তবে আপনার টেবিলের আকারের উপর নির্ভর করে এটি ব্যবহারিক হতে পারে না


1
সত্য, তবে পরের বারের জন্য আপনি জানেন। আমারও একই সমস্যা ছিল এবং অন্যদের সাথে ভাগ করে নেওয়া ভাল বলে মনে হয়েছিল
সানডাউনে

আমি কেবল এটি 3 বছর দেরী সম্পর্কে টিজিং ছিল। আপনি ভাগ করে নেওয়ায় সত্যিই খুশি। সুতরাং আরও 1।
জেডি আইজ্যাকস

আমি কল্পনা করি এটি অনুলিপিভাবে একটি সদৃশ মুছে ফেলেছে তাই নিশ্চিত হয়ে নিন যে প্রতিটি সারির মধ্যে পৃথক পৃথক তথ্য নেই যা জানার বা রাখতে দরকারী হতে পারে।
জোশুয়া পিন্টার

2 বছর দেরি হয়ে যাওয়ার পরেও উত্তরটির জন্য +1। আমি দুর্ঘটনাক্রমে একটি যৌগিক কী মুছে ফেলেছিলাম এবং এটি ছিল জীবন রক্ষাকারী। আপনাকে ধন্যবাদ
আইভোড

আমি কয়েকটি সদৃশ সন্ধানকারী কৌশল চেষ্টা করেছি এবং সেগুলির কোনওটিই এই সহজ এবং দ্রুত ছিল না। এই পদ্ধতিটি ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ।
ক্রিস্টান ও।


4

সদৃশগুলি সন্ধান করতে:

select stone_id, upcharge_title from tablename group by stone_id, upcharge_title having count(*)>1

ভবিষ্যতে এটি এড়াতে সীমাবদ্ধ করতে, এই দুটি ক্ষেত্রে একটি যৌথ অনন্য কী তৈরি করুন।


1
আপনাকে অনেক ধন্যবাদ, আপনি দয়া করে আমাকে ডুপ্লিকেটগুলির একটি ছাড়া সমস্ত কীভাবে মুছবেন তা আমাকে বলতে পারেন। এবং আমি কীভাবে phpmyadmin এ একটি সমন্বিত কী সেটআপ করব। ধন্যবাদ!!!
জেডি আইজ্যাক

3

ঘটনাক্রমে, টেবিলের উপর একটি সংমিশ্রিত অনন্য প্রতিবন্ধকতা এটি প্রথম স্থানে ঘটতে বাধা দেবে।

ALTER TABLE table
    ADD UNIQUE(stone_id, charge_title)

(এটি বৈধ টি এসকিউএল। মাইএসকিউএল সম্পর্কে নিশ্চিত নয়।)


1
আমি মনে করি এটি কাজ করে তবে আমি ডুপ্লিকেটগুলি সরিয়ে না দেওয়া পর্যন্ত এটি করতে দেবে না। ধন্যবাদ।
জেডি আইজ্যাকস

1

এই এসও পোস্টটি আমাকে সহায়তা করেছিল, তবে আমিও কীভাবে একটির সারি মুছতে এবং রাখি তা জানতে চেয়েছিলাম ... এখানে নকল সারিগুলি মুছতে এবং একটি রাখতে পিএইচপি সমাধান রয়েছে (আমার ক্ষেত্রে কেবল 2 টি কলাম ছিল এবং এটি একটিতে রয়েছে) সদৃশ বিভাগের সমিতিগুলি সাফ করার জন্য ফাংশন)

$dupes = $db->query('select *, count(*) as NUM_DUPES from PRODUCT_CATEGORY_PRODUCT group by fkPRODUCT_CATEGORY_ID, fkPRODUCT_ID having count(*) > 1');
if (!is_array($dupes))
    return true;
foreach ($dupes as $dupe) {
    $db->query('delete from PRODUCT_CATEGORY_PRODUCT where fkPRODUCT_ID = ' . $dupe['fkPRODUCT_ID'] . ' and fkPRODUCT_CATEGORY_ID = ' . $dupe['fkPRODUCT_CATEGORY_ID'] . ' limit ' . ($dupe['NUM_DUPES'] - 1);
}

(সীমা NUM_DUPES - 1) একক সারি সংরক্ষণ করে ...

সবাইকে ধন্যবাদ


3
ALTER IGNORE TABLE table ADD UNIQUE INDEX index_name(stone_id, charge_title)কেবলমাত্র একটি অনন্য জুড়ি রেখে সদৃশ সারিগুলি সরানো হবে।
দেব-নাল-বাসিন্দা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.