মাইএসকিএল নিরাপদ মোডের অধীনে মুছুন


92

আমার কাছে একটি টেবিল প্রশিক্ষক রয়েছে এবং আমি বেতনের যে পরিমাণ রেকর্ড রয়েছে তাতে মুছে ফেলতে চাই একটি স্বজ্ঞাত উপায়ে এইরকম:

delete from instructor where salary between 13000 and 15000;

তবে নিরাপদ মোডের অধীনে, আমি একটি প্রাথমিক কী (আইডি) না দিয়ে কোনও রেকর্ড মুছতে পারি না।

সুতরাং আমি নিম্নলিখিত বর্গ লিখুন:

delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000);

তবে, একটি ত্রুটি আছে:

You can't specify target table 'instructor' for update in FROM clause

আমি বিভ্রান্ত কারণ আমি যখন লিখি

select * from instructor where ID in (select ID from instructor where salary between 13000 and 15000);

এটি একটি ত্রুটি উত্পাদন করে না।

আমার প্রশ্নটি হ'ল:

  1. এই ত্রুটি বার্তার সত্যিকারের অর্থ কী এবং কেন আমার কোডটি ভুল?
  2. নিরাপদ মোডের অধীনে এই কোডটি কীভাবে পুনরায় লেখার জন্য?

ধন্যবাদ!


আপনি কি নিরাপদ মোড চালু রাখতে চান? এবং আপনি মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করছেন?
wribit

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

4
না - আমি জিজ্ঞাসা করছিলাম কারণ আপনি যদি এটি মাইএসকিউএল ওয়ার্কবেঞ্চে বন্ধ করতে চান তবে আমি আপনাকে কীভাবে বলতে পারতাম। আমি ব্যক্তিগতভাবে এটি নিয়ে কাজ করি ... আইডি থাকা মহান নিরাপত্তা বুদ্ধিমান - তবে উন্নয়ন বুদ্ধিমান, আমি এটি একটি ব্যথা পেয়েছি
wribit

উত্তর:


233

চারদিকে গুগলিং, জনপ্রিয় উত্তরটি "কেবল নিরাপদ মোডটি বন্ধ করুন" বলে মনে হচ্ছে :

SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;

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

সুতরাং, আপনার দ্বিতীয় ক্যোয়ারীটি চিহ্নটির কাছাকাছি, তবে আরেকটি সমস্যা হিট করেছে: মাইএসকিউএল সাবকিউয়েরিতে কয়েকটি বিধিনিষেধ প্রয়োগ করে এবং এর মধ্যে একটি হ'ল আপনি কোনও টেবিল থেকে সাবকিউয়েরিতে নির্বাচন করার সময় পরিবর্তন করতে পারবেন না।

মাইএসকিউএল ম্যানুয়াল থেকে উদ্ধৃতি দেওয়া, সাবকিউয়েরিতে বিধিনিষেধ :

সাধারণভাবে, আপনি কোনও টেবিলটি সংশোধন করতে পারবেন না এবং সাব-কোয়েরিতে একই টেবিল থেকে নির্বাচন করতে পারবেন না। উদাহরণস্বরূপ, এই সীমাবদ্ধতা নিম্নলিখিত ফর্মগুলির বিবৃতিতে প্রযোজ্য:

DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);

ব্যতিক্রম: আপনি যদি এফআরওএম ক্লজে সংশোধিত টেবিলের জন্য সাবকিয়ারি ব্যবহার করেন তবে পূর্ববর্তী নিষেধাজ্ঞাগুলি প্রযোজ্য নয়। উদাহরণ:

UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);

এখানে এফআরওএম ক্লজের সাবকোয়ারি থেকে ফলাফলটি একটি অস্থায়ী টেবিল হিসাবে সংরক্ষণ করা হয়, সুতরাং t এর সাথে সম্পর্কিত সারিগুলি ইতিমধ্যে টি-তে আপডেট হওয়ার সময় নির্বাচন করা হয়েছিল।

যে শেষ বিট আপনার উত্তর। অস্থায়ী সারণীতে লক্ষ্য আইডি নির্বাচন করুন, তারপরে সেই টেবিলের আইডি উল্লেখ করে মুছুন:

DELETE FROM instructor WHERE id IN (
  SELECT temp.id FROM (
    SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
  ) AS temp
);

এসকিউএলফিডাল ডেমো


6
আপনার ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ! তবে, আমি আপনার কোডটি মাইএসকিএল ওয়ার্কবেঞ্চে চেষ্টা করেছিলাম এবং এটি এখনও বলেছে "আপনি নিরাপদ আপডেট মোড ব্যবহার করছেন এবং আপনি কোনও কেই কলাম ব্যবহার করেন না এমন কোনও টেবিল আপডেট করার চেষ্টা করেছিলেন" tried
রোল্যান্ড লুও

এটা অপ্রত্যাশিত। আপনার প্রাথমিক কীটি আলাদা নামে রয়েছে? আমি লক্ষ্য করেছি যে আপনার প্রশ্নের নামটি ইঙ্গিত করে বলে মনে হচ্ছে ID, যখন আমার উত্তর ব্যবহার করছে id
রটার

হ্যাঁ, আমি এটিকে আইডিতে পরিবর্তন করি এবং এটি কার্যকর হয় না। আমি প্রশিক্ষক যেখানে আইডি = '1' থেকে মুছে ফেলার চেষ্টা করেছি এবং এটি কাজ করে তাই আইডিটি প্রাথমিক কী
Roland luo

4
@ রোল্যান্ডলু আমি জানি এটি অনেক দিন হয়ে গেছে, তবে আপনি যদি কখনও কর্মক্ষেত্র আবিষ্কার করেন তবে আমি আগ্রহী। স্পষ্টতই এই পদ্ধতিটি অন্যান্য পরিস্থিতিতেও কাজ করেছে, তাই আমি কেন জানি আপনার কেস আলাদা। আপনার সার্ভার বা সংস্করণে নির্দিষ্ট কিছু, সম্ভবত?
রটার

19

আপনি মাইএসকিউএলকে এমন ভাবনায় চালিত করতে পারেন যে আপনি আসলে একটি প্রাথমিক কী কলামটি নির্দিষ্ট করছেন। এটি আপনাকে নিরাপদ মোড "ওভাররাইড" করতে দেয়।

ধরে নিই যে আপনার একটি স্বয়ং-বর্ধিত সংখ্যা প্রাথমিক কী সহ একটি টেবিল রয়েছে, আপনি নিম্নলিখিতটি করতে পারেন:

DELETE FROM tbl WHERE id <> 0

12

মাইএসকিএল ওয়ার্কবেঞ্চে নিরাপদ মোডটি বন্ধ করা হচ্ছে 6.3.4.0

সম্পাদনা মেনু => পছন্দসমূহ => এসকিউএল সম্পাদক: অন্যান্য বিভাগ: অপশন চেক করতে "নিরাপদ আপডেটগুলি" ক্লিক করুন ...

ওয়ার্কবেঞ্চ পছন্দসমূহ


4
"এই কোডটিকে নিরাপদ মোডের অধীনে কাজ করতে কীভাবে পুনরায় লেখার জন্য ?" ==> আপনার উত্তরটি জানায় কীভাবে নিরাপদ মোড অক্ষম করবেন;)
বাইটহ্যামস্টার

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

0

আমার কাছে আরও সহজ সমাধান রয়েছে, এটি আমার পক্ষে কাজ করছে; এটি একটি কার্যক্ষমতার মতো তবে এটি ব্যবহারযোগ্য হতে পারে এবং আপনার সেটিংস পরিবর্তন করতে হবে না। আমি ধরে নিয়েছি যে আপনি এমন মানটি ব্যবহার করতে পারেন যা কখনই থাকবে না, তবে আপনি এটি আপনার WHERE ধারাটিতে ব্যবহার করুন

মাইটিবেল থেকে মাইফিল্ড যেখানে মুছে ফেলুন IS_NOT_EQUAL AnyValueNoItemOnMyFieldWillEverHave থেকে মুছুন

আমি সমাধানটি খুব বেশি পছন্দ করি না, সে কারণেই আমি এখানে আছি, তবে এটি কার্যকর হয় এবং এটির উত্তর দেওয়া থেকে ভাল বলে মনে হয়

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