ডেটা ইনসার্ট হওয়ার **পূর্বে** যাচাই বা পরিবর্তন করতে BEFORE INSERT TRIGGER ব্যবহার করা হয়। নিচে `Value` কলামের যোগফল ৬০ অতিক্রম করলে ইনসার্ট ব্লক করার উদাহরণ দেওয়া হলো।
সিনট্যাক্স
DELIMITER //
CREATE TRIGGER yourTriggerName
BEFORE INSERT ON yourTableName
FOR EACH ROW
BEGIN
-- আপনার লজিক
END //
DELIMITER ;
টেবিল তৈরি
mysql> CREATE TABLE DemoTable1919 (Value INT);
ট্রিগার তৈরি: যোগফল ৬০ বেশি হলে ব্লক
mysql> DELIMITER //
mysql> CREATE TRIGGER sumis60
BEFORE INSERT ON DemoTable1919
FOR EACH ROW
BEGIN
DECLARE custom_message VARCHAR(256);
IF (SELECT SUM(Value) FROM DemoTable1919) = 60 THEN
SET custom_message = 'cannot insert because sum(Value) is greater than 60';
SIGNAL SQLSTATE '13500' SET MESSAGE_TEXT = custom_message;
END IF;
END //
mysql> DELIMITER ;
ট্রিগার টেস্ট করা
mysql> INSERT INTO DemoTable1919 VALUES (10); -- OK mysql> INSERT INTO DemoTable1919 VALUES (20); -- OK mysql> INSERT INTO DemoTable1919 VALUES (30); -- OK (মোট ৬০) mysql> INSERT INTO DemoTable1919 VALUES (40); -- ERROR!
এরর আউটপুট:
ERROR 1644 (13500): cannot insert because sum(Value) is greater than 60
গুরুত্বপূর্ণ পয়েন্ট
FOR EACH ROW— প্রতিটি ইনসার্ট সারির জন্য ট্রিগার চালানো হয়।SIGNAL SQLSTATE '13500'— কাস্টম এরর থ্রো করে (45000 বা 13500 ইউজার-ডিফাইনড)।NEW.Valueদিয়ে ইনসার্ট হওয়া মান পাওয়া যায় (এখানে পুরো টেবিলের SUM চেক করা হয়েছে)।DELIMITER //— সেমিকোলন (;) প্রসিডিউর/ট্রিগারের ভেতরে ব্যবহার করার জন্য ডিলিমিটার পরিবর্তন করা হয়।
সীমাবদ্ধতা
- BEFORE ট্রিগারে `AUTO_INCREMENT` মান পাওয়া যায় না (AFTER ট্রিগারে পাওয়া যায়)।
- ট্রিগারের ভেতর থেকে একই টেবিলে `SELECT` করা যায়, কিন্তু `INSERT/UPDATE/DELETE` করা যায় না (mutating table error)।