মাইএসকিউএলে একাধিক টেবিল থেকে কীভাবে মুছবেন?


116

আমি একবারে কয়েকটি টেবিল থেকে মুছতে চেষ্টা করছি। আমি কিছুটা গবেষণা করেছি এবং এটি নিয়ে এসেছি

DELETE FROM `pets` p,
            `pets_activities` pa
      WHERE p.`order` > :order
        AND p.`pet_id` = :pet_id
        AND pa.`id` = p.`pet_id`

তবে আমি এই ত্রুটিটি পাচ্ছি

আনকচড ডেটাবেস_এক্সেপশন [1064]: আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; 'পি, pets_activitiesপ্যা ... এর কাছাকাছি ব্যবহারের জন্য সঠিক সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন ...

আমি এর আগে কখনও ক্রস টেবিল মোছা হয়নি, তাই আমি অনভিজ্ঞ এবং আপাতত আটকে আছি!

আমি কি ভুল করছি?

উত্তর:


204

একটি ব্যবহার করুন JOINমধ্যে DELETEবিবৃতি।

DELETE p, pa
      FROM pets p
      JOIN pets_activities pa ON pa.id = p.pet_id
     WHERE p.order > :order
       AND p.pet_id = :pet_id

বিকল্পভাবে আপনি ব্যবহার করতে পারেন ...

DELETE pa
      FROM pets_activities pa
      JOIN pets p ON pa.id = p.pet_id
 WHERE p.order > :order
   AND p.pet_id = :pet_id

... কেবল এ থেকে মুছতে pets_activities

এই দেখুন

একক টেবিল মোছাগুলিকে জন্য, এখনো উল্লেখ সততা সঙ্গে, সেখানে সঙ্গে কাজ অন্যান্য উপায় আছে EXISTS, NOT EXISTS, IN, NOT INএবং ইত্যাদি কিন্তু আগে যেখানে আপনি যা টেবিল উপনাম সঙ্গে মুছে ফেলতে থেকে উল্লেখ উপরে এক FROMদফা কয়েক প্রশংসনীয় আঁট এর আপনি খুঁজে পেতে পারেন আরও সহজে দাগ। আমি EXISTS99% ক্ষেত্রে একটিতে পৌঁছানোর প্রবণতা রাখি এবং তারপরে 1% রয়েছে যেখানে এই মাইএসকিউএল সিনট্যাক্সটি দিন নেয়।


7
আমি 6 টি বড় টেবিলগুলিতে (everyone 15k সারি প্রায় প্রত্যেকে) যোগদানের সাথে এই "সমস্ত 1 টি প্রশ্নের মুছে ফেলুন" চেষ্টা করেছি এবং
কোয়েরিতে

1
@ কেডম্যান এটিই আসল সঠিক উত্তর; এটি ব্যবহারের বিরুদ্ধে তর্ক থাকতে পারে, তবে এটি উপলক্ষে খুব দরকারী
সাইমন ক্রিশ্চান

1
+1 আমি সম্মত হই যে এটি আসল সঠিক উত্তরে, যেহেতু প্রশ্নটি "আপনার উচিত" ছিল না তবে "কীভাবে করবেন"। যাইহোক, আমি 1% সম্পর্কে শুনে আগ্রহী হব কারণ আমি এমন একটি পরিস্থিতি সম্পর্কে ভাবতে পারি না যেখানে এটি পছন্দ হবে।
এরিক রবার্টসন

2
@ টেকহাউস, আপনি কি যোগ দিয়ে সূচকগুলিতে ফিল্টার করেছেন? 15 কে এক্স 15 কে x 15 কেজি 15 কে 15 কে এক্স 15 কে 11 মিলিয়ন। একটি SELECTএকইভাবে দীর্ঘ সময় নিয়েছে?
পল ড্রাগার

6
আপনি বাম জয়েন্টও ব্যবহার করতে পারেন, এটি ব্যবহারকারীর, যদি দ্বিতীয় টেবিলের কোনও মিল নেই তবে অন্য কিছু মুছে ফেলা হবে না।
Lexib0y

20

যেহেতু এটি petsএবং এর মধ্যে একটি সাধারণ পিতামাতার / সন্তানের সম্পর্ক বলে মনে হয়pets_activities , আপনি একটি মুছে ফেলা ক্যাসকেড সঙ্গে আপনার ফরেইন কী বাধ্যতা তৈরি ভালো হবে।

এইভাবে, যখন একটি petsসারি মুছে ফেলা হয়, এর pets_activitiesসাথে যুক্ত সারিগুলি স্বয়ংক্রিয়ভাবে মোছা হবে।

তারপরে আপনার প্রশ্নটি সরল হয়ে ওঠে:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id

3
@ এরিক, আপনি যদি রেফারেন্সিয়াল অখণ্ডতা সেট করে থাকেন তবে ক্যাসকেডিং ডিলিটগুলি নিজে থেকে মোছার চেয়ে আর কোনও সমস্যা করতে পারে না। আমরা ইতিমধ্যে জানি যে ম্যাপিংয়ের কারণে paএটি একটি উপযুক্ত শিশু । pid/pet_id
প্যাক্সডিয়াবলো

14
ভাল, আপনারা আপনার নিজের চিন্তাভাবনা করেছেন তবে মনে হচ্ছে আপনি অনেকগুলি ডিবিএমএসের শক্তি ছাড় করছেন ing ক্যাসকেডিং মুছে ফেলা হ'ল ডেটা ম্যানেজমেন্টের ততটুকু ট্রিগার, সঞ্চিত পদ্ধতি বা সীমাবদ্ধতা এবং সেগুলি কেবল বিপজ্জনক যদি আপনি জানেন না আপনি কী করছেন dangerous তবুও, আমি আরও তর্ক করব না, আমাদের কেবল একমত হতে হবে না agree
প্যাক্সিডিয়াবল

8
এরিক, এখন আপনি আমার আগ্রহ প্রকাশ করেছেন। সীমাবদ্ধতা ছাড়াই আপনি কীভাবে ডাটাবেসের মধ্যে ডেটা অখণ্ডতা নিশ্চিত করবেন?
প্যাক্সিডিয়াবলো

4
@ এরিক বলেছেন, "আমি ট্রিগার, সঞ্চিত পদ্ধতি বা বাধাও ব্যবহার করি না।" আহ, আপনি এক্সেল ব্যবহার করুন। :-)
james.garriss

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

14

এটা ব্যবহার কর

DELETE FROM `articles`, `comments` 
USING `articles`,`comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

অথবা

DELETE `articles`, `comments` 
FROM `articles`, `comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

1
এই এবং কয়েক অন্যান্য অপশন ব্যবহার করার জন্য একটি ভাল রেফারেন্স পাওয়া mysqltutorial.org/mysql-delete-statement.aspx
Mavelo

3

এই মুহুর্তে পরীক্ষা করার জন্য আমার কাছে কোনও মাইএসকিএল ডাটাবেস নেই, তবে আপনি কি অনুচ্ছেদটির আগে কী মুছবেন তা উল্লেখ করার চেষ্টা করেছেন? উদাহরণ স্বরূপ:

DELETE p, pa FROM `pets` p,
        `pets_activities` pa
  WHERE p.`order` > :order
    AND p.`pet_id` = :pet_id
    AND pa.`id` = p.`pet_id`

আমি মনে করি আপনি ব্যবহার করেছেন সিনট্যাক্সটি mysql এর নতুন সংস্করণে সীমাবদ্ধ।


1
এই ক্যোয়ারীটি সফলভাবে কার্যকর করা হয়েছে, তবে এটি কোনও সারি মুছে ফেলেনি (তবে আমি বিশ্বাস করি এটি থাকা উচিত)।
অ্যালেক্স

2

সিনট্যাক্সটি আমার কাছে ঠিক দেখাচ্ছে ... এটি ব্যবহারের জন্য পরিবর্তন করার চেষ্টা করুন INNER JOIN...

এই একবার দেখুন ।


7
খুব খারাপ আপনি আসল সমাধানটি অন্তর্ভুক্ত করেননি, কারণ লিঙ্কটি সঠিক!
মাইক্রোজ

1

2017 এ কারও কাছে এটি পড়ার জন্য, আমি এভাবেই কিছু কাজ করেছি।

DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND 
pets.`pet_id` = :pet_id

সাধারণত, একাধিক সারণী থেকে সারিগুলি মুছতে, আমার অনুসরণ করা সিনট্যাক্সটি নীচে দেওয়া হয়েছে। সমাধানটি একটি ধারণার উপর ভিত্তি করে তৈরি করা হয়েছে যে দুটি টেবিলের মধ্যে কিছু সম্পর্ক রয়েছে।

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]

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