এখানে একটি সঞ্চিত পদ্ধতি (মাইএসকিউএল ডায়ালেক্ট) রয়েছে:
DELIMITER $$
DROP PROCEDURE IF EXISTS SetDefaultForZip;
CREATE PROCEDURE SetDefaultForZip (NEWID INT)
BEGIN
DECLARE FOUND_TRUE,OLDID INT;
SELECT COUNT(1) INTO FOUND_TRUE FROM PostalCode WHERE isDefault = TRUE;
IF FOUND_TRUE = 1 THEN
SELECT ID INTO OLDID FROM PostalCode WHERE isDefault = TRUE;
IF NEWID <> OLDID THEN
UPDATE PostalCode SET isDefault = FALSE WHERE ID = OLDID;
UPDATE PostalCode SET isDefault = TRUE WHERE ID = NEWID;
END IF;
ELSE
UPDATE PostalCode SET isDefault = TRUE WHERE ID = NEWID;
END IF;
END;
$$
DELIMITER ;
আপনার টেবিলটি পরিষ্কার আছে এবং সঞ্চিত পদ্ধতিটি কাজ করছে তা নিশ্চিত করার জন্য, আইডি 200 ডিফল্ট হিসাবে ধরে নিয়ে এই পদক্ষেপগুলি চালান:
ALTER TABLE PostalCode DROP INDEX isDefault_ndx;
UPDATE PostalCodes SET isDefault = FALSE;
ALTER TABLE PostalCode ADD INDEX isDefault_ndx (isDefault);
CALL SetDefaultForZip(200);
SELECT ID FROM PostalCodes WHERE isDefault = TRUE;
একটি সঞ্চিত পদ্ধতি পরিবর্তে একটি ট্রিগার সম্পর্কে কীভাবে?
DELIMITER $$
CREATE TRIGGER postalcodes_bu BEFORE UPDATE ON PostalCodes FOR EACH ROW
BEGIN
DECLARE FOUND_TRUE,OLDID INT;
IF NEW.isDefault = TRUE THEN
SELECT COUNT(1) INTO FOUND_TRUE FROM PostalCode WHERE isDefault = TRUE;
IF FOUND_TRUE = 1 THEN
SELECT ID INTO OLDID FROM PostalCode WHERE isDefault = TRUE;
UPDATE PostalCodes SET isDefault = FALSE WHERE ID = OLDID;
END IF;
END IF;
END;
$$
DELIMITER ;
আপনার টেবিলটি পরিষ্কার এবং ট্রিগার কাজ করছে তা নিশ্চিত করার জন্য, আইডি 200 ডিফল্ট হিসাবে ধরে নিয়ে এই পদক্ষেপগুলি চালান:
DROP TRIGGER postalcodes_bu;
ALTER TABLE PostalCode DROP INDEX isDefault_ndx;
UPDATE PostalCodes SET isDefault = FALSE;
ALTER TABLE PostalCode ADD INDEX isDefault_ndx (isDefault);
DELIMITER $$
CREATE TRIGGER postalcodes_bu BEFORE UPDATE ON PostalCodes FOR EACH ROW
BEGIN
DECLARE FOUND_TRUE,OLDID INT;
IF NEW.isDefault = TRUE THEN
SELECT COUNT(1) INTO FOUND_TRUE FROM PostalCode WHERE isDefault = TRUE;
IF FOUND_TRUE = 1 THEN
SELECT ID INTO OLDID FROM PostalCode WHERE isDefault = TRUE;
UPDATE PostalCodes SET isDefault = FALSE WHERE ID = OLDID;
END IF;
END IF;
END;
$$
DELIMITER ;
UPDATE PostalCodes SET isDefault = TRUE WHERE ID = 200;
SELECT ID FROM PostalCodes WHERE isDefault = TRUE;
PostalCodes
খালি কখন কী হবে ? যদি একটি সারিটির ইতিমধ্যে একটি সম্পত্তি থাকা উচিত, অন্য কোনও সারি (যদি এটি উপস্থিত থাকে) একই এসকিউএল বিবৃতিতে সত্য হিসাবে সেট না করা হয় তবে এটি মিথ্যাতে সেট হওয়া থেকে বিরত থাকবে? শূন্য সারিতে লেনদেনের সীমানার মধ্যে সম্পত্তি থাকতে পারে? সারণির শেষ সারিটি সম্পত্তি রাখতে বাধ্য হওয়া উচিত এবং মুছে ফেলা থেকে বাধা দেওয়া উচিত? অভিজ্ঞতা আমাকে বলেছে যে "সঠিকভাবে এক সারির গ্যারান্টি" হ'ল বাস্তবে অন্যরকম কিছু অর্থ বোঝায়, প্রায়শই কেবল "সর্বাধিক এক সারি"।