স্কিল সারিগুলি মুছুন যেখানে আইডিগুলির অন্য কোনও টেবিলের সাথে মিল নেই


160

আমি একটি mysql টেবিল এতিম এন্ট্রি মুছে ফেলার চেষ্টা করছি।

আমার কাছে 2 টি টেবিল রয়েছে:

সারণী files:

| id | ....
------------
| 1  | ....
| 2  | ....
| 7  | ....
| 9  | ....

টেবিল blob:

| fileid | ....
------------
| 1  | ....
| 2  | ....
| 3  | ....
| 4  | ....
| 4  | ....
| 4  | ....
| 9  | ....

fileidএবং idকলাম টেবিল একসঙ্গে যোগদানের জন্য ব্যবহার করা যাবে।

আমি টেবিলের সমস্ত সারি মুছে ফেলতে চাই blobযেখানে টেবিলটিতে fileidপাওয়া যায় না files.id

সুতরাং উপরের উদাহরণটি ব্যবহার করে blobসারণি সারণি মুছে যাবে: 3 এবং 4 (গুলি) সারণীতে।


1
আপনি যদি ব্যবহার করে থাকেন তবে দ্বিতীয় উত্তরে যানnull
পেসারিয়ার

উত্তর:


327

বাম যোগদান / IS নাল ব্যবহার করে:

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

উপস্থিত নেই:

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

ব্যবহার না করা:

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

সতর্কতা

যখনই সম্ভব, কোনও লেনদেনের মধ্যে ডিলিটগুলি সম্পাদন করুন (ধরে নিলেন সমর্থিত - আইআই: মাইআইএসএএম-তে নয়) যাতে আপনি সমস্যার ক্ষেত্রে পরিবর্তনগুলি ফিরিয়ে নিতে রোলব্যাক ব্যবহার করতে পারেন।


12
সাধারণভাবে উপরেরগুলির মধ্যে দ্রুততম কোনটি?
হাম্পাস ব্রায়ানল্ফ

2
কোনও কারণে, বাম জয়েন্ট ব্যবহার করে মোছা এমএস এসকিউএল সার্ভার এমজিএমটি স্টুডিওতে কাজ করে না (কেন তা নিশ্চিত নয়; এটি কেবল বাম যোগদানের বিষয়ে অভিযোগ করেছে)। যে কেউ কেন জানেন? এটি যদিও নেই অস্তিত্ব ব্যবহার করে কাজ করেছে :)
আন্না

5
: অবগতির জন্য, এখানে এই তিনটি পদ্ধতির আপেক্ষিক কার্যকারিতা একটি দরকারী আলোচনা এর explainextended.com/2009/09/18/...
moustachio

2
@ পেসারিয়র - "ভুল" কিছুটা শক্ত। নিশ্চিত মানুষ চেনা করতে, উত্তর না কাজ যদি fileidহয় অ nullable । এছাড়াও, তৃতীয় সমাধান ( NOT IN) কেবল f.idনন-অ্যালাবল দ্বারা এটি প্রয়োজন । সম্ভবত এটি একটি প্রাথমিক কী, তাই এটি হবে।
টুলমেকারস্টেভ


26
DELETE FROM blob 
WHERE fileid NOT IN 
       (SELECT id 
        FROM files 
        WHERE id is NOT NULL/*This line is unlikely to be needed 
                               but using NOT IN...*/
      )

কি "/ * এই লাইন প্রয়োজন হতে করার সম্ভাবনা কম কিন্তু না ... * / ব্যবহার" মানে অনুমিত?
পেসারিয়ার 14

1
@ পেসারিয়র - NOT IN (NULL)একটি খালি ফলাফল সেট প্রদান করে যাতে NULL বাদ দেওয়া দরকার। তবে কোনও idকলাম সম্ভবত যেহেতু "প্রয়োজনীয় হওয়ার সম্ভাবনা নেই" কমিয়ে দেবে না
মার্টিন স্মিথ

বাহ ভাল ধরা। সুতরাং ওমপোনিগুলির উত্তরটি ভুল! not in(null)বেশ যৌক্তিক, কেন এটি কাজ করে না? এর পেছনে যৌক্তিকতা কী?
পেসারিয়ার


1
@ বুঙ্কারডিভ তারপরে তিনটি অংশ অবজেক্টের নাম ব্যবহার করুন যাতে ডাটাবেসের নাম অন্তর্ভুক্ত থাকে।
মার্টিন স্মিথ

17
DELETE FROM blob
WHERE NOT EXISTS (
    SELECT *
    FROM files
    WHERE id=blob.id
)

1
আমি মনে করি একটি আছে files.idএবং blob.fileid। আমি অনুমান করছি আপনার জিজ্ঞাসাটি একটি ত্রুটির ফলস্বরূপ হবে।
jwww

-8
delete from table1 t1 
    WHERE not exists (select id from table2 where related_field_in_t2=t1.id) 
    AND not exists (select id from table3 where related_field_in_t3=t1.id) 
    AND not exists (select id from table4 where related_field_t4=t1.id) 
    AND not exists (select id from table5 where related_field_t5=t1.id);

3
আমি হ্রাস পেয়েছি কারণ: ১. এটি পোস্ট করা প্রসঙ্গে প্রশ্নের উত্তর দেওয়ার চেষ্টা করে না। ২) কোন ব্যাখ্যা নেই (এবং কোড-কেবলমাত্র উত্তরগুলি স্ট্যাকওভারফ্লোতে কম মান)। 3. NOT EXISTS9 বছর আগে ইতিমধ্যে পোস্ট করা হয়েছিল। ৪. আপনি মাইএসকিউএল কীওয়ার্ডের জন্য অবিচ্ছিন্নভাবে সমস্ত ক্যাপ ব্যবহার করার সর্বোত্তম অনুশীলন প্রচার করেন নি। অন্য কথায়, এখানে রাখার মতো কোনও কিছুই নেই - এই কারণেই আমি এই পোস্টটি মোছার পক্ষেও ভোট দিয়েছি।
মিকম্যাকুসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.