প্রশ্নোত্তর স্টাইল
ঠিক আছে, ঘন্টাখানেক সমস্যা নিয়ে গবেষণা এবং লড়াইয়ের পরে আমি জানতে পেরেছি যে আপনার টেবিলের কাঠামোর উপর নির্ভর করে এবং যদি আপনার কাছে সততা বজায় রাখতে বিদেশী কীগুলি নিষেধাজ্ঞাগুলি সক্রিয় করা থাকে তবে এটি সম্পাদন করার দুটি উপায় রয়েছে। আমার পরিস্থিতি হতে পারে এমন লোকদের জন্য কিছুটা সময় বাঁচাতে আমি এটি একটি পরিষ্কার ফর্ম্যাটে ভাগ করতে চাই।
বিকল্প 1: আপনি সারি মুছে ফেলতে পারবেন
অন্য কথায়, আপনার কাছে বিদেশী কী নেই, বা যদি আপনার কাছে থাকে তবে আপনার এসকিউএল ইঞ্জিনটি এমনভাবে কনফিগার করা আছে যাতে কোনও সততা ব্যতিক্রম না থাকে are যাওয়ার উপায় হ'ল INSERT or REPLACE । আপনি যদি এমন কোনও প্লেয়ার সন্নিবেশ / আপডেট করার চেষ্টা করছেন যাঁর আইডি ইতিমধ্যে বিদ্যমান রয়েছে, এসকিউএলাইট ইঞ্জিন সেই সারিটি মুছে ফেলবে এবং আপনার সরবরাহ করা ডেটা sertোকাবে। এখন প্রশ্ন আসে: পুরানো আইডি যুক্ত রাখতে কী করতে হবে?
ধরা যাক আমরা ব্যবহারকারীর নাম = 'স্টিভেন' এবং বয়স = 32 সহ ইউপিএসআরটি করতে চাই ।
এই কোডটি দেখুন:
INSERT INTO players (id, name, age)
VALUES (
coalesce((select id from players where user_name='steven'),
(select max(id) from drawings) + 1),
32)
কৌশলটি একত্রিত হয়। এটি 'স্টিভেন' ব্যবহারকারীর আইডি যদি থাকে তবে তা ফেরত দেয় এবং অন্যথায় এটি নতুন নতুন আইডি প্রদান করে।
বিকল্প 2: আপনি সারিটি মোছার সামর্থ্য রাখতে পারবেন না
পূর্ববর্তী সমাধানটি নিয়ে নজরদারি করার পরে, আমি বুঝতে পারি যে আমার ক্ষেত্রে এটি ডেটা ধ্বংস করতে পারে, যেহেতু এই আইডিটি অন্য টেবিলের জন্য একটি বিদেশী কী হিসাবে কাজ করে। এছাড়াও, আমি মুছে ফেলুন ক্যাসকেডে ক্লজটি দিয়ে টেবিলটি তৈরি করেছি , যার অর্থ এটি নিঃশব্দে ডেটা মুছবে। বিপজ্জনক
সুতরাং, আমি প্রথমে একটি আইএফ ক্লজটি ভেবেছিলাম তবে এসকিউএলাইটের কেবলমাত্র CASE রয়েছে । আর এই ক্ষেত্রে ব্যবহার করা যাবে না (বা অন্তত আমি এটি পরিচালনা না) এক সম্পাদন করতে আপডেট করেন (প্লেয়ার থেকে আইডি নির্বাচন যেখানে USER_NAME = 'স্টিভেন') বিদ্যমান ক্যোয়ারী, এবং ঢোকান যদি না করেনি। যাও না।
এবং তারপরে, অবশেষে আমি সাফল্যের সাথে নিষ্ঠুর শক্তি ব্যবহার করেছি। যুক্তিটি হ'ল, আপনি যে প্রতিটি ইউপিএসআরটি সম্পাদন করতে চান তার জন্য প্রথমে একটি INSERT বা IGNORE কার্যকর করুন যাতে আমাদের ব্যবহারকারীর সাথে সারি রয়েছে কিনা তা নিশ্চিত করুন এবং তারপরে আপনি যে তথ্যটি inোকানোর চেষ্টা করেছিলেন ঠিক সেই একই ডেটা দিয়ে একটি আপডেট আপডেট জিজ্ঞাসা করুন।
আগের মতো একই ডেটা: ব্যবহারকারীর নাম = 'স্টিভেন' এবং বয়স = 32।
INSERT OR IGNORE INTO players (user_name, age) VALUES ('steven', 32);
UPDATE players SET user_name='steven', age=32 WHERE user_name='steven';
এবং যে সব!
সম্পাদনা
অ্যান্ডি যেমন মন্তব্য করেছেন, প্রথমে sertোকানোর চেষ্টা করা এবং তারপরে আপডেট করা প্রত্যাশার চেয়ে প্রায়শই ফায়ারিং ট্রিগার ঘটায়। এটি আমার মতে কোনও ডেটা সুরক্ষার সমস্যা নয়, তবে এটি সত্য যে অপ্রয়োজনীয় ঘটনা গুলি চালানো মোটেই অর্থহীন নয়। সুতরাং, একটি উন্নত সমাধান হবে:
UPDATE players SET age=32 WHERE user_name='steven';
INSERT OR IGNORE INTO players (user_name, age) VALUES ('steven', 32);