মাইএসকিউএল, একটি ক্যোয়ারী সহ একাধিক সারণী আপডেট করুন


132

আমার একটি ফাংশন রয়েছে যা তিনটি টেবিল আপডেট করে তবে আমি এটি সম্পাদন করতে তিনটি ক্যোরি ব্যবহার করি। আমি ভাল অনুশীলনের জন্য আরও সুবিধাজনক পদ্ধতির ব্যবহার করতে চাই।

আমি কীভাবে একক কোয়েরি দিয়ে মাইএসকিউএল একাধিক টেবিল আপডেট করতে পারি?


3
আপনি উত্পন্ন কোডের একটি উদাহরণ প্রদান করতে পারেন? টেবিলগুলির মধ্যে একটি সাধারণ কী আছে?
জোনাথন দিবস

উত্তর:


451

দুটি টেবিলের ক্ষেত্রে নিন, Booksএবং Orders। ক্ষেত্রে, আমরা একটি নির্দিষ্ট ক্রমে বই সংখ্যা বাড়িয়ে Order.ID = 1002Ordersটেবিল তারপর আমরা কমাতে প্রয়োজন যে একই সংখ্যা দ্বারা আমাদের স্টক উপলব্ধ বই মোট সংখ্যা Booksটেবিল।

UPDATE Books, Orders
SET Orders.Quantity = Orders.Quantity + 2,
    Books.InStock = Books.InStock - 2
WHERE
    Books.BookID = Orders.BookID
    AND Orders.OrderID = 1002;

যদি আমি এসকিউএল ক্যোয়ারিতে "লিমিটেড" অন্তর্ভুক্ত করতে চাই তবে আমাকে কি লিমিটেড 1 বা লিমিটেড 2 বলতে হবে?
ব্লুয়েডেজ

2
বনাম লেনদেন করার সুবিধা কী? ধন্যবাদ!
পলকন

2
@ পলকন, আমি ধরে নিয়েছি যে লেনদেনগুলি ব্যবহার করার সময় প্রচুর ওভারহেড জড়িত থাকে কারণ লেনদেনের কোনও প্রক্রিয়া ব্যর্থ হলে রোল-ব্যাকগুলি উপলব্ধ থাকতে হবে।
থিজেস রিজবিক

27
এই কোয়েরিটি ব্যবহার করার সময় সাধারণ সতর্কতা। প্রতিটি টেবিলের জন্য WHERE ধারাটি আলাদাভাবে মূল্যায়ন করা হয়। বুকস.বুকআইডি = অর্ডারস.বুকআইডিআইডি অত্যন্ত গুরুত্বপূর্ণ, এগুলি ছাড়াই বুকস টেবিল আপডেট কেবলমাত্র নির্দিষ্ট আইডি সহ সারির জন্য নয়, সমস্ত সারিগুলিতেই ঘটে। কিছু পাঠ কঠোরভাবে শেখা হয়, এটি একটি ভয়ঙ্কর উপায়ে শেখা হয়েছিল।
nheimann1

1
@ nheimann1 এবং ঠিক এই কারণেই আমি সর্বদা লোকদের এএনএসআই "অভ্যন্তরীণ যোগদান" সিনট্যাক্স ব্যবহার করার পরামর্শ দিই। এই শর্তটি ভুলে যাওয়া এবং পরিবর্তে একটি সম্পূর্ণ কার্টেসিয়ান যোগদান করা খুব সহজ।
বুদ্ধিহীন 4

77
UPDATE t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
SET t1.a = 'something',
    t2.b = 42,
    t3.c = t2.c
WHERE t1.a = 'blah';

এটি কী আপডেট হতে চলেছে তা দেখার জন্য আপনি এটিকে একটি নির্বাচিত বিবৃতিতে রূপান্তর করতে পারেন, যেমন:

SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c
FROM t1
INNER JOIN t2 ON t2.t1_id = t1.id
INNER JOIN t3 ON t2.t3_id = t3.id
WHERE t1.a = 'blah';

অন্যান্য উত্তরের মতো একই টেবিলগুলি ব্যবহার করে একটি উদাহরণ:

SELECT Books.BookID, Orders.OrderID,
    Orders.Quantity AS CurrentQuantity,
    Orders.Quantity + 2 AS NewQuantity,
    Books.InStock AS CurrentStock,
    Books.InStock - 2 AS NewStock
FROM Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
WHERE Orders.OrderID = 1002;

UPDATE Books
INNER JOIN Orders ON Books.BookID = Orders.BookID
SET Orders.Quantity = Orders.Quantity + 2,
    Books.InStock = Books.InStock - 2
WHERE Orders.OrderID = 1002;

সম্পাদনা করুন:

শুধু মজাদার জন্য, আসুন আরও কিছু আকর্ষণীয় কিছু যুক্ত করুন।

ধরা যাক আপনার একটি টেবিল booksএবং একটি টেবিল রয়েছে authors। তোমার booksএকটি আছে author_id। কিন্তু যখন ডাটাবেসটি মূলত তৈরি করা হয়েছিল তখন কোনও বিদেশী কী বাধার সীমাবদ্ধ করা হয়নি এবং পরবর্তীতে ফ্রন্ট-এন্ড কোডে একটি বাগের ফলে কিছু বই অবৈধ author_idগুলি যুক্ত করা হয়েছিল । ডিবিএ হিসাবে আপনাকে booksকী হওয়া author_idউচিত তা যাচাই করার জন্য আপনাকে এগুলির মধ্যে দিয়ে যেতে হবে না, তাই সিদ্ধান্ত নেওয়া হয়েছে যে তথ্য ক্যাপচারকারীরা booksডানদিকে নির্দেশ করতে পারে authors। তবে প্রত্যেকটি বইয়ের জন্য প্রচুর বই রয়েছে এবং আসুন আমরা আপনাকে জানাতে পারি author_idযে যেগুলির সাথে একটি সত্যিকারের সাথে মিল রয়েছে authorসেগুলি সঠিক। এটি কেবলমাত্র অস্তিত্বহীনauthor_idযেগুলি অবৈধ। ব্যবহারকারীদের বইয়ের বিবরণ আপডেট করার জন্য ইতিমধ্যে একটি ইন্টারফেস রয়েছে এবং বিকাশকারীরা কেবল এই সমস্যার জন্য এটি পরিবর্তন করতে চান না। তবে বিদ্যমান ইন্টারফেসটি একটি করে INNER JOIN authors, তাই অবৈধ লেখক সহ সমস্ত বই বাদ দেওয়া হয়।

আপনি যা করতে পারেন তা হ'ল "অজানা লেখক" এর মতো একটি ভুয়া লেখকের রেকর্ড .োকান। তারপরে author_idঅজ্ঞাত লেখককে নির্দেশ করতে সমস্ত খারাপ রেকর্ডগুলির আপডেট করুন । তারপরে ডেটা ক্যাপচারকারীরা লেখককে "অজানা লেখক" এ সেট করে সমস্ত বই অনুসন্ধান করতে পারেন, সঠিক লেখকটি সন্ধান করে সেগুলি ঠিক করতে পারেন।

অজানা লেখককে নির্দেশ করতে আপনি কীভাবে সমস্ত খারাপ রেকর্ড আপডেট করবেন? এটির মতো (অজানা লেখকের ধারণা author_id99999):

UPDATE books
LEFT OUTER JOIN authors ON books.author_id = authors.id
SET books.author_id = 99999
WHERE authors.id IS NULL;

উপরে এছাড়াও আপডেট হবে booksযে একটি আছে NULL author_idঅজানা লেখক। যদি আপনি এটি না চান তবে অবশ্যই আপনি যোগ করতে পারেন AND books.author_id IS NOT NULL


35

আপনি এইভাবে একটি যোগদানের ব্যবহার করে একটি প্রশ্নের সাথেও এটি করতে পারেন:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;

এবং তারপরে অবশ্যই এই একটি কোয়েরি প্রেরণ করুন। আপনি এখানে যোগদানের বিষয়ে আরও পড়তে পারেন: http://dev.mysql.com/doc/refman/5.0/en/join.html । আপনি এখানে পড়তে পারেন এমন একাধিক টেবিল আপডেটগুলিতে অর্ডার ও সীমাবদ্ধ করার জন্যও বেশ কয়েকটি বিধিনিষেধ রয়েছে: http://dev.mysql.com/doc/refman/5.0/en/update.html (just ctrl + f "join")।


এটি একটি "যোগ দিন" ;-)
আন্ডারস্কোর_ডি

2

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


আমি কোথায় পদ্ধতি লিখব? আপনি একটি উদাহরণ প্রদান করতে পারেন?
অ্যাডামস্কি

1
পারমাণবিকতার প্রয়োজনীয়তা ব্যাখ্যা করার জন্য আপ-ভোট দিয়েছিলেন - এটি উপলব্ধি করাও গুরুত্বপূর্ণ যে সঞ্চিত পদ্ধতি ব্যবহার করা একক ধারাবাহিকতার গ্যারান্টি দেয় না, আপনার এখনও লেনদেনগুলি ব্যবহার করতে হবে; একইভাবে, কোনও সংযুক্ত পদ্ধতি ব্যবহার না করেই লেনদেনগুলি সম্পাদন করা যেতে পারে, তবে তারা একই সংযোগে সঞ্চালিত হয়। এই ক্ষেত্রে, একটি বহু-টেবিল আপডেট ব্যবহার আরও ভাল।
ডানকান

2

আপনি যখন একাধিক ক্যোয়ারী বলছেন তখন কি আপনি বোঝাচ্ছেন একাধিক এসকিউএল স্টেটমেন্টগুলি যেমন:

UPDATE table1 SET a=b WHERE c;
UPDATE table2 SET a=b WHERE d;
UPDATE table3 SET a=b WHERE e;

বা একাধিক ক্যোয়ারী ফাংশন কল হিসাবে রয়েছে:

mySqlQuery(UPDATE table1 SET a=b WHERE c;)
mySqlQuery(UPDATE table2 SET a=b WHERE d;)
mySqlQuery(UPDATE table3 SET a=b WHERE e;)

প্রাক্তন সবাই একক মাইএসকিউএলকিউরি কল ব্যবহার করেই করা যেতে পারে যদি আপনি এটি অর্জন করতে চান তবে কেবল মাইএসকিউএলকিউরি ফাংশনটি নিম্নলিখিত পদ্ধতিতে কল করুন:

mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;)

এটি একটি মাইএসকিউএকএলকিউরি () কল দিয়ে তিনটি ক্যোয়ারিকেই কার্যকর করবে।


মাইএসকিউএলকিয়ারি () একটি কাস্টম ফাংশন বা বিল্ট ফাংশনে? আমি এই সম্পর্কে আরও জানতে চাই।
দেবাশিস

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