কিছু ক্ষেত্রে, উত্পাদনে একটি আপডেটের বিবৃতি চালানো দিনটি বাঁচাতে পারে। তবে একটি বিরক্তিকর আপডেট প্রাথমিক সমস্যার চেয়ে খারাপ হতে পারে।
একটি পরীক্ষা ডাটাবেস ব্যবহারের সংক্ষিপ্ততা, আপডেট স্টেটমেন্টটি চালানোর আগে কী করবে তা বলার বিকল্পগুলি কী কী?
কিছু ক্ষেত্রে, উত্পাদনে একটি আপডেটের বিবৃতি চালানো দিনটি বাঁচাতে পারে। তবে একটি বিরক্তিকর আপডেট প্রাথমিক সমস্যার চেয়ে খারাপ হতে পারে।
একটি পরীক্ষা ডাটাবেস ব্যবহারের সংক্ষিপ্ততা, আপডেট স্টেটমেন্টটি চালানোর আগে কী করবে তা বলার বিকল্পগুলি কী কী?
উত্তর:
ইমাদ যেমন বলেছেন যে কোনও লেনদেন ব্যবহার করা ছাড়াও (যা যাইহোক বাধ্যতামূলক হওয়া উচিত) আপনি একটি স্যানিটি পরীক্ষা করতে পারেন যে আপডেটের মতো একই ক্লাসটি ব্যবহার করে একটি নির্বাচন পরিচালনা করে কোন সারিগুলি প্রভাবিত হয়।
সুতরাং আপনি যদি আপডেট হয়
UPDATE foo
SET bar = 42
WHERE col1 = 1
AND col2 = 'foobar';
নিম্নলিখিতটি আপনাকে দেখাবে যে কোন সারিগুলি আপডেট করা হবে:
SELECT *
FROM foo
WHERE col1 = 1
AND col2 = 'foobar';
FOREIGN KEY UPDATE CASCADE
আপনার স্কেল ব্যর্থ হয়
লেনদেন সম্পর্কে কি? তাদের রোলব্যাক-বৈশিষ্ট্য রয়েছে।
@see https://dev.mysql.com/doc/refman/5.0/en/commit.html
উদাহরণ স্বরূপ:
START TRANSACTION;
SELECT * FROM nicetable WHERE somthing=1;
UPDATE nicetable SET nicefield='VALUE' WHERE somthing=1;
SELECT * FROM nicetable WHERE somthing=1; #check
COMMIT;
# or if you want to reset changes
ROLLBACK;
SELECT * FROM nicetable WHERE somthing=1; #should be the old value
সাধারণভাবে এই লাইনগুলি একবারের মতো কার্যকর করা হবে না। পিএইচপি ফে তে আপনি এমন কিছু লিখবেন (সম্ভবত কিছুটা ক্লিনার, তবে দ্রুত উত্তর দিতে চেয়েছিলেন ;-)):
$MysqlConnection->query('START TRANSACTION;');
$erg = $MysqlConnection->query('UPDATE MyGuests SET lastname='Doe' WHERE id=2;');
if($erg)
$MysqlConnection->query('COMMIT;');
else
$MysqlConnection->query('ROLLBACK;');
আর একটি উপায় হ'ল মাইএসকিউএল ভেরিয়েবলগুলি ব্যবহার করতে হবে ( https://dev.mysql.com/doc/refman/5.7/en/user-variables.htm l এবং https://stackoverflow.com/a/18499823/1416909 দেখুন ):
# do some stuff that should be conditionally rollbacked later on
SET @v1 := UPDATE MyGuests SET lastname='Doe' WHERE id=2;
IF(v1 < 1) THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
তবে আমি আপনার পছন্দসই প্রোগ্রামিং ভাষায় উপলব্ধ ভাষা র্যাপারগুলি ব্যবহার করার পরামর্শ দেব।
স্বতঃসিদ্ধকরণ বন্ধ ...
মাইএসকিউএল
set autocommit=0;
এটি বর্তমান অধিবেশনটির জন্য অটোমোটি বন্ধ করে দেয়।
আপনি আপনার বক্তব্য কার্যকর করেন, দেখুন কী পরিবর্তন হয়েছে এবং তারপরে এটি ভুল হলে রোলব্যাক করুন বা যদি আপনি প্রত্যাশা করেন তবে তা প্রতিশ্রুতি দিন!
সম্পাদনা: নির্বাচিত ক্যোয়ারী চালানোর পরিবর্তে লেনদেনগুলি ব্যবহার করার সুবিধাটি হ'ল আপনি ফলাফলটি সহজেই চেক করতে পারেন।
আমি জানি এটি অন্যান্য উত্তরের পুনরাবৃত্তি, তবে এটির আপডেটের পরীক্ষার জন্য অতিরিক্ত পদক্ষেপ নিতে কিছুটা মানসিক সমর্থন রয়েছে: ডি
পরীক্ষার আপডেটের জন্য, হ্যাশ # আপনার বন্ধু।
আপনার যদি আপডেট স্টেটমেন্ট থাকে তবে:
UPDATE
wp_history
SET history_by="admin"
WHERE
history_ip LIKE '123%'
আপনি পরীক্ষার জন্য হ্যাশ আপডেট এবং সেট আউট করেছেন, তারপরে এগুলিতে ফিরে আসুন:
SELECT * FROM
#UPDATE
wp_history
#SET history_by="admin"
WHERE
history_ip LIKE '123%'
এটি সাধারণ বিবৃতি জন্য কাজ করে।
একটি অতিরিক্ত ব্যবহারিকভাবে বাধ্যতামূলক সমাধান হ'ল যখনই কোনও উত্পাদনের টেবিলে আপডেট ব্যবহার করা হয় তখন একটি অনুলিপি (ব্যাকআপ ডুপ্লিকেট) পাওয়া যায়। Phpmyadmin> ক্রিয়াকলাপগুলি: অনুলিপি: টেবিল_ইয়ারম্মেথডে। <= 100M টেবিলের জন্য এটি কয়েক সেকেন্ড সময় নেয়।
নেই একটি সরাসরি উত্তর, কিন্তু আমি যে পারে দ্বারা এড়ানো করা হয়েছে অনেক borked শঙ্কু তথ্য পরিস্থিতিতে দেখা করেছি টাইপ WHERE
প্রথম দফা ! কখনও কখনও একটি WHERE 1 = 0
নিরাপদে খুব কার্যকরভাবে একত্রে কাজের বিবরণ স্থাপনে সহায়তা করতে পারে। এবং একটি আনুমানিক বাস্তবায়ন পরিকল্পনার দিকে তাকান, যা সারিগুলি প্রভাবিত করে তা অনুমান করে, দরকারী হতে পারে। এর বাইরেও, এমন কোনও লেনদেনে যা আপনি অন্যেরা যেমন বলেছিলেন তেমন ফিরে আসে।
WHERE 1 = 0
বহনযোগ্য নয় যদি কেউ এই ডিবিএমএসের সাথে কাজ করছেন এমন কেউ আসে। উদাহরণস্বরূপ, এসকিউএল সার্ভার গ্রহণ করবে না WHERE FALSE
।
এই ক্ষেত্রে আপনি যা পরীক্ষা করতে চান, কেবলমাত্র বর্তমান কলাম মান এবং শীঘ্রই আপডেট হওয়া কলাম মানগুলিতে ফোকাস করা ভাল ধারণা ।
নীচের কোডটি একবার দেখে নিন যা আমি WHMCS এর দাম আপডেট করার জন্য লিখেছি:
# UPDATE tblinvoiceitems AS ii
SELECT ### JUST
ii.amount AS old_value, ### FOR
h.amount AS new_value ### TESTING
FROM tblinvoiceitems AS ii ### PURPOSES.
JOIN tblhosting AS h ON ii.relid = h.id
JOIN tblinvoices AS i ON ii.invoiceid = i.id
WHERE ii.amount <> h.amount ### Show only updatable rows
# SET ii.amount = h.amount
এইভাবে আমরা ইতিমধ্যে বিদ্যমান মানগুলি বনাম নতুন মানগুলি পরিষ্কারভাবে তুলনা করি।
আর একটি বিকল্প হ'ল মাইএসকিউএলকে কোয়েরি প্ল্যানের জন্য জিজ্ঞাসা করা। এটি আপনাকে দুটি বিষয় বলে:
মাইএসকিউএল এবং বেশিরভাগ এসকিউএল ডাটাবেসে ক্যোয়ারী প্ল্যান কমান্ডটি হয় describe
, সুতরাং আপনি এটি করবেন:
describe update ...;