এসকিউএল আপডেটের স্টেটমেন্টটি চালানোর আগে এটি কীভাবে পরীক্ষা করবেন?


95

কিছু ক্ষেত্রে, উত্পাদনে একটি আপডেটের বিবৃতি চালানো দিনটি বাঁচাতে পারে। তবে একটি বিরক্তিকর আপডেট প্রাথমিক সমস্যার চেয়ে খারাপ হতে পারে।

একটি পরীক্ষা ডাটাবেস ব্যবহারের সংক্ষিপ্ততা, আপডেট স্টেটমেন্টটি চালানোর আগে কী করবে তা বলার বিকল্পগুলি কী কী?

উত্তর:


53

ইমাদ যেমন বলেছেন যে কোনও লেনদেন ব্যবহার করা ছাড়াও (যা যাইহোক বাধ্যতামূলক হওয়া উচিত) আপনি একটি স্যানিটি পরীক্ষা করতে পারেন যে আপডেটের মতো একই ক্লাসটি ব্যবহার করে একটি নির্বাচন পরিচালনা করে কোন সারিগুলি প্রভাবিত হয়।

সুতরাং আপনি যদি আপডেট হয়

UPDATE foo
  SET bar = 42
WHERE col1 = 1
  AND col2 = 'foobar';

নিম্নলিখিতটি আপনাকে দেখাবে যে কোন সারিগুলি আপডেট করা হবে:

SELECT *
FROM foo
WHERE col1 = 1
  AND col2 = 'foobar';

4
তখন তথ্য যাচাই করার জন্য লেনদেনগুলি ব্যবহার করা আরও ভাল। তিনি ফলাফলটি যাচাই করতে চান বলে ধরে নিয়েছি, তাঁর বক্তব্যটি 'এসইটি বার = 42' এর চেয়ে জটিল, তাই তার অধিবেশনে তিনি ফলাফলের ফলাফলের সেটটি পরীক্ষা করতে বেশ কয়েকটি অনুসন্ধান করতে সক্ষম হবেন ...
ইমাদ মোকাদ্দেম

4
@ ইমাদ মোকাদ্দেম: আমি একমত এবং তাই আমি লিখেছিলাম " ইমাদ যেমন বলেছিলেন তেমন কোনও লেনদেন ব্যবহার করা ছাড়াও "
a_horse_with_no_name

এবং যদি FOREIGN KEY UPDATE CASCADEআপনার স্কেল ব্যর্থ হয়
সবুজ

@ গ্রীন: "ব্যর্থ" বলতে কী বোঝ?
a_horse_with_no_name

76

লেনদেন সম্পর্কে কি? তাদের রোলব্যাক-বৈশিষ্ট্য রয়েছে।

@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

নীচে @rickozoe থেকে প্রশ্নের উত্তর দিন:

সাধারণভাবে এই লাইনগুলি একবারের মতো কার্যকর করা হবে না। পিএইচপি ফে তে আপনি এমন কিছু লিখবেন (সম্ভবত কিছুটা ক্লিনার, তবে দ্রুত উত্তর দিতে চেয়েছিলেন ;-)):

$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;

তবে আমি আপনার পছন্দসই প্রোগ্রামিং ভাষায় উপলব্ধ ভাষা র‍্যাপারগুলি ব্যবহার করার পরামর্শ দেব।


4
নেস্টেড লেনদেনের সাথে এর অপ্রত্যাশিত ফলাফল হবে।
স্কোনস

আপনি একটি উদাহরণ দিতে পারেন?
মার্সেল ল্যাঙ্গ

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

57

স্বতঃসিদ্ধকরণ বন্ধ ...

মাইএসকিউএল

set autocommit=0;

এটি বর্তমান অধিবেশনটির জন্য অটোমোটি বন্ধ করে দেয়।

আপনি আপনার বক্তব্য কার্যকর করেন, দেখুন কী পরিবর্তন হয়েছে এবং তারপরে এটি ভুল হলে রোলব্যাক করুন বা যদি আপনি প্রত্যাশা করেন তবে তা প্রতিশ্রুতি দিন!

সম্পাদনা: নির্বাচিত ক্যোয়ারী চালানোর পরিবর্তে লেনদেনগুলি ব্যবহার করার সুবিধাটি হ'ল আপনি ফলাফলটি সহজেই চেক করতে পারেন।


4
@ অডিস্ট্রয়: প্রতিটি বুদ্ধিমান ডিবিএমএস লেনদেনকে সমর্থন করে।
a_horse_with_no_name

7
কেবলমাত্র লেনদেনটি দ্রুত সম্পাদন করা বা রোলব্যাক করা মনে রাখবেন, বা আপনি অন্য লেনদেনগুলি ব্লক করার ঝুঁকি নিয়েছেন - এবং সবচেয়ে খারাপ ক্ষেত্রে আপনার অ্যাপ্লিকেশনটিকে গ্রাইন্ডিং স্টল এনে দেবে। কোয়েরিটি কার্যকর করা ভাল ধারণা নয়, তারপরে দুপুরের খাবার খাবে, তারপরে ফলাফলগুলি দেখতে ফিরে আসুন! :-)
গ্যারি ম্যাকগিল

@ গ্যারিএমসিগিল: মুলতুবি লেনদেন (কমপক্ষে আধুনিক ডিবিএমএসে) কেবল অন্য লেখার লেনদেনকে অবরুদ্ধ করবে ।
a_horse_with_no_name

4
@ অডিস্ট্রয়: দুর্ভাগ্যক্রমে, মাইআইএসএএম সর্বত্র ব্যবহৃত হয়, এবং আমি ডিবিএ নই।
স্থির_আরত্তি

4
SQL বিবৃতি যুক্ত হয়েছে :)
ইমাদ মোকাদ্দেম

11

আমি জানি এটি অন্যান্য উত্তরের পুনরাবৃত্তি, তবে এটির আপডেটের পরীক্ষার জন্য অতিরিক্ত পদক্ষেপ নিতে কিছুটা মানসিক সমর্থন রয়েছে: ডি

পরীক্ষার আপডেটের জন্য, হ্যাশ # আপনার বন্ধু।

আপনার যদি আপডেট স্টেটমেন্ট থাকে তবে:

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 টেবিলের জন্য এটি কয়েক সেকেন্ড সময় নেয়।


5

নেই একটি সরাসরি উত্তর, কিন্তু আমি যে পারে দ্বারা এড়ানো করা হয়েছে অনেক borked শঙ্কু তথ্য পরিস্থিতিতে দেখা করেছি টাইপ WHEREপ্রথম দফা ! কখনও কখনও একটি WHERE 1 = 0নিরাপদে খুব কার্যকরভাবে একত্রে কাজের বিবরণ স্থাপনে সহায়তা করতে পারে। এবং একটি আনুমানিক বাস্তবায়ন পরিকল্পনার দিকে তাকান, যা সারিগুলি প্রভাবিত করে তা অনুমান করে, দরকারী হতে পারে। এর বাইরেও, এমন কোনও লেনদেনে যা আপনি অন্যেরা যেমন বলেছিলেন তেমন ফিরে আসে।


4
@ সিস্টেমেপারাডক্স - কোনও এটিই WHERE 1 = 0বহনযোগ্য নয় যদি কেউ এই ডিবিএমএসের সাথে কাজ করছেন এমন কেউ আসে। উদাহরণস্বরূপ, এসকিউএল সার্ভার গ্রহণ করবে না WHERE FALSE
ডেভিড এম

2

এই ক্ষেত্রে আপনি যা পরীক্ষা করতে চান, কেবলমাত্র বর্তমান কলাম মান এবং শীঘ্রই আপডেট হওয়া কলাম মানগুলিতে ফোকাস করা ভাল ধারণা ।

নীচের কোডটি একবার দেখে নিন যা আমি 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

এইভাবে আমরা ইতিমধ্যে বিদ্যমান মানগুলি বনাম নতুন মানগুলি পরিষ্কারভাবে তুলনা করি।


1

whereআপনি আপডেট ক্যোয়ারিতে যে শর্তটি প্রয়োগ করছেন তার সাথে একই টেবিলের উপরের নির্বাচন জিজ্ঞাসা চালান ।


0

এটি একটি SELECTতৈরি করুন,

যদি আপনি পেয়েছেন পছন্দ করুন

UPDATE users SET id=0 WHERE name='jan'

এটি রূপান্তর

SELECT * FROM users WHERE name='jan'


0

আর একটি বিকল্প হ'ল মাইএসকিউএলকে কোয়েরি প্ল্যানের জন্য জিজ্ঞাসা করা। এটি আপনাকে দুটি বিষয় বলে:

  • কোয়েরিতে কোনও সিনট্যাক্স ত্রুটি রয়েছে কিনা, যদি তাই হয় তবে ক্যোয়ারী প্ল্যান কমান্ড নিজেই ব্যর্থ হবে
  • মাইএসকিউএল কীভাবে ক্যোয়ারি চালানোর পরিকল্পনা করছে, উদাহরণস্বরূপ এটি কোন সূচকগুলি ব্যবহার করবে

মাইএসকিউএল এবং বেশিরভাগ এসকিউএল ডাটাবেসে ক্যোয়ারী প্ল্যান কমান্ডটি হয় describe, সুতরাং আপনি এটি করবেন:

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