Programming and Exciting Things

Създаване на Mysql Trigger

Published on 16.06.2010

Първо какво са тригерите в Mysql ? В общи линии това са обекти които са асоциирани с таблица и се активират при изпълняването на INSERT, UPDATE, DELETE в асоциираната им таблица. Синтаксиса за създаване на trigger под mysql e

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
Какво искам да постигна ... В общи линии целта ми е много проста, имам таблица с езикови низове и при обновяване на даден низ от тази таблица, предишната му стойност да се записва в друга таблица с цел справка при необходимост. Така нека първо да създадем таблицата към която ще "вържем" тригера.
CREATE TABLE `site_languages` (
`site_languages_id` INT(10) NOT NULL AUTO_INCREMENT,
`site_languages_key` VARCHAR(250) NOT NULL,
`site_languages_value` TEXT NULL,
`site_languages_lang` CHAR(5) NULL DEFAULT NULL,
`site_languages_file` CHAR(5) NOT NULL,
PRIMARY KEY (`site_languages_id`),
INDEX `site_languages_key` (`site_languages_key`),
INDEX `site_languages_lang` (`site_languages_lang`)
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1
и след това таблицата където ще се пазят старите версии на езиковия низ.
CREATE TABLE `site_languages_versions` (
`site_languages_id` INT(10) NOT NULL AUTO_INCREMENT,
`site_languages_lang_id` INT(10) NOT NULL DEFAULT '0',
`site_languages_key` VARCHAR(250) NOT NULL,
`site_languages_value` TEXT NULL,
`site_languages_lang` CHAR(5) NULL DEFAULT NULL,
`site_languages_timestamp` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`site_languages_id`),
INDEX `site_languages_key` (`site_languages_key`),
INDEX `FK_site_languages_versions_site_languages` (`site_languages_lang_id`),
CONSTRAINT `FK_site_languages_versions_site_languages` FOREIGN KEY (`site_languages_lang_id`)    REFERENCES `site_languages` (`site_languages_id`) ON UPDATE NO ACTION ON DELETE CASCADE
)
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
пс: в примерния код има добавени и Foreign keys-ове които можете да премахнете :) Така нека създадем и тригера който ще свърши работата :)
DELIMITER //
CREATE TRIGGER `before_site_languages_update` BEFORE UPDATE ON `site_languages`
FOR EACH ROW BEGIN
INSERT INTO `site_languages_versions` (`site_languages_key`,`site_languages_lang_id`,
`site_languages_value`,`site_languages_lang`)
VALUES (OLD.`site_languages_key`,OLD.`site_languages_id`, OLD.`site_languages_value`,OLD.`site_languages_lang`);
END//
DELIMITER ;
Ta нека се опитам да обясня какво се случва ред по ред.
CREATE TRIGGER `before_site_languages_update` BEFORE UPDATE ON `site_languages` 
С този ред създаваме тригер с име "before_site_languages_update" който ще се задейства преди да се обнови таблицата site_languages, именно този ред " BEFORE UPDATE ON" посочва кога да се задейства въпросния тригер. След това имаме "FOR EACH ROW BEGIN" с който казваме че за всеки ROW
INSERT INTO `site_languages_versions` (`site_languages_key`,`site_languages_lang_id`,
`site_languages_value`,`site_languages_lang`)
VALUES (OLD.`site_languages_key`,OLD.`site_languages_id`, OLD.`site_languages_value`,OLD.`site_languages_lang`);
Взимаме старата информация с "OLD." и го добавяме в 'site_languages_versions' таблицата. Завършваме с "END//". Ами това е :) Изглежда простичко но върша добра работа. Важно е да се знае че тригерът не може да се асоциира с темп таблица или view, също така създаването на тригери е налично от версия 5.0.2 на Mysql Линкове: http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

Здравей, свят!

Published on 20.05.2010

И такаа време беше и аз да се сдобия с личен блог. Планирам да пиша за нещата които се случват около мен (колкото и скучни да се те) и за това как напредвам из дебрите на програмирането и ученето :) И за да не прекъсвам традицията

 <?php echo 'Hello World!'; ?>