এসকিউএল কিভাবে একটি কমান্ডের একটি ইন কলামের জন্য একটি বাড়াতে বা হ্রাস করতে হয়


119

আমার একটি অর্ডার সারণী রয়েছে যার একটি পরিমাণ কলাম রয়েছে। চেক ইন বা চেক আউট করার সময় আমাদের সেই পরিমাণটি কলামটি একে একে আপডেট করতে হবে। একটি ক্রিয়াতে এটি করার কোনও উপায় আছে বা আমাদের বিদ্যমান মানটি পেতে হবে এবং তারপরে একটি যুক্ত করতে বা বিয়োগ করতে হবে?

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

ধন্যবাদ,

উত্তর:


250

প্রথমটির উত্তর দিতে:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

দ্বিতীয়টির উত্তর দিতে:

এই কাজ করার বিভিন্ন উপায় আছে। যেহেতু আপনি কোনও ডাটাবেস নির্দিষ্ট করেন নি, তাই আমি মাইএসকিউএল ধরে নেব।

  1. INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  2. REPLACE INTO table SET x=1, y=2

তারা উভয়ই আপনার প্রশ্ন পরিচালনা করতে পারে। তবে, প্রথম সিনট্যাক্সটি কেবলমাত্র এটি প্রতিস্থাপনের পরিবর্তে রেকর্ডটি আপডেট করার জন্য আরও নমনীয়তার অনুমতি দেয় (দ্বিতীয়টি যেমনটি করে)।

মনে রাখবেন যে উভয়ের অস্তিত্বের জন্য একটি অনন্য কী সংজ্ঞায়িত করতে হবে ...


32
যেহেতু আপনি কোনও ডাটাবেস নির্দিষ্ট করেন নি, তাই আপনার সত্যিকারের স্ট্যান্ডার্ড এসকিউএল অনুমান করা উচিত।
paxdiablo

12

প্রথম প্রশ্নের একক-পদক্ষেপের উত্তর হ'ল এরকম কিছু ব্যবহার করা:

update TBL set CLM = CLM + 1 where key = 'KEY'

এটি এটি করার একক নির্দেশের উপায়।

দ্বিতীয় প্রশ্ন হিসাবে, আপনার পছন্দসই UPSERTফলাফল পেতে আপনার ডিবিএমএস-নির্দিষ্ট এসকিউএল জিমন্যাস্টিকস (পছন্দ ) করা উচিত নয় । আপডেট-বা-সন্নিবেশ করার জন্য একটি স্ট্যান্ডার্ড পদ্ধতি রয়েছে যার জন্য নির্দিষ্ট ডিবিএমএসের প্রয়োজন হয় না।

try:
    insert into TBL (key,val) values ('xyz',0)
catch:
    do nothing
update TBL set val = val + 1 where key = 'xyz'

অর্থাৎ আপনি প্রথমে সৃষ্টিটি করার চেষ্টা করুন। যদি এটি ইতিমধ্যে সেখানে থাকে তবে ত্রুটিটি উপেক্ষা করুন। অন্যথায় আপনি এটি 0 মান দিয়ে তৈরি করেন।

তারপরে আপডেটটি করুন যা সঠিকভাবে কাজ করবে কি না:

  • সারিটি মূলত বিদ্যমান ছিল।
  • আপনার সন্নিবেশ এবং আপডেটের মধ্যে কেউ এটি আপডেট করেছে।

এটি একটি একক নির্দেশ নয় এবং এখনও আশ্চর্যজনকভাবে যথেষ্ট, এটি আমরা দীর্ঘদিন ধরে এটি সফলভাবে করে চলেছি।


4

যদি আমার বোঝাপড়াটি সঠিক হয়, আপডেটগুলি খুব সহজ হওয়া উচিত। আমি কেবল নিম্নলিখিতটি করতাম।

UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0

সমস্ত সারিগুলির পরিবর্তে কেবলমাত্র একটি একক সারি আপডেট করতে আপনার অতিরিক্ত ফিল্টারগুলির প্রয়োজন হতে পারে।

সন্নিবেশকারীদের জন্য, আপনি স্থানীয়ভাবে আপনার রেকর্ড সম্পর্কিত কিছু অনন্য আইডি ক্যাশে করতে পারেন এবং এই ক্যাশের বিরুদ্ধে চেক করতে পারেন এবং সন্নিবেশ করানো হবে কিনা তা সিদ্ধান্ত নিতে পারেন। বিকল্প পদ্ধতিটি সর্বদা সন্নিবেশ করানো এবং পিকে লঙ্ঘনের ত্রুটিটি পরীক্ষা করা এবং এড়াতে হবে কারণ এটি একটি অপ্রয়োজনীয় inোকানো।


4
UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

আমি যতদূর জানি এসকিউএল-তে INSERT-OR-UPDATE এর জন্য কোনও বিল্ট-ইন সমর্থন নেই। আমি এটি অর্জনের জন্য একটি সঞ্চিত পদ্ধতি তৈরি করার বা শর্তসাপূর্ণ কোয়েরি ব্যবহার করার পরামর্শ দিচ্ছি। এখানে আপনি বিভিন্ন ডাটাবেসগুলির সমাধানগুলির সংগ্রহ খুঁজে পেতে পারেন।


আপনি যেমন
সংরক্ষণাগার

0

দ্বিতীয়টির উত্তর দিতে:

কলামটি অনন্য করে তুলুন এবং ব্যতিক্রমটি যদি একই মানতে সেট করা থাকে তবে তা ধরুন।


0

@ ডটজো আপডেট করুন এবং অ্যাডউটিং রোউকাউন্ট পরীক্ষা করা সস্তা, তারপরে সত্যিকারের পরে একটি সন্নিবেশ করুন।

ব্যতিক্রম ব্যয়বহুল && আপডেটগুলি আরও ঘন ঘন

পরামর্শ: আপনি যদি আপনার ডালে উবার অভিনয় করতে চান তবে সারিটি আপডেট করার জন্য সারিটি আপডেট করার জন্য একটি অনন্য আইডিতে সামনের প্রান্তটি পাস করুন ull

ডালগুলি সিআরইউডি হওয়া উচিত, এবং রাষ্ট্রহীন হওয়ার বিষয়ে চিন্তা করার দরকার নেই।

যদি আপনি এটিকে রাজ্যহীন করেন, ভাল সূচকগুলি সহ, আপনি নীচের এসকিউএল বনাম 1 বিবৃতিতে কোনও পার্থক্য দেখতে পাবেন না। যদি (শীর্ষস্থানীয় 1 * ফর্ম x নির্বাচন করুন যেখানে পিকে = @ আইডি) অন্য আপডেট sertোকান

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