DELIMITER |
DROP PROCEDURE IF EXISTS `procedure_insert_into_internal_content`;
CREATE PROCEDURE `procedure_insert_into_internal_content`(IN CONTENTID BIGINT, IN CONTENTNAME VARCHAR(255) charset utf8)
BEGIN
    DECLARE INDEXF SMALLINT;
    DECLARE INDEXL SMALLINT;
    DECLARE BADWORDS TEXT;
    DECLARE ONEWORD VARCHAR(16);
    DECLARE ONELETTER VARCHAR(1);
    DECLARE CONTENTONLYLETTERS VARCHAR(255) DEFAULT '';

    SET INDEXF = 1;
    WHILE INDEXF < LENGTH(CONTENTNAME) DO
        SET ONELETTER = SUBSTRING(CONTENTNAME, INDEXF, 1);
        IF ONELETTER REGEXP '[a-zA-Zа-яА-Я0-9 ]' THEN
            SET CONTENTONLYLETTERS = CONCAT(CONTENTONLYLETTERS, ONELETTER);
        END IF;
        SET INDEXF = INDEXF + 1;
    END WHILE;

    SELECT GROUP_CONCAT(`word`) INTO BADWORDS FROM `insignificant_words`;
    IF ISNULL(BADWORDS) THEN
        SET BADWORDS = '';
    END IF;

    SET INDEXF = 1;
    SET INDEXL = LOCATE(' ', CONTENTONLYLETTERS);

    IF INDEXL = 0 THEN
        INSERT INTO `dictionary_words` VALUES (CONTENTID, CONTENTONLYLETTERS);
    ELSE
        WHILE INDEXL > 0 DO
            SET ONEWORD = SUBSTRING(CONTENTONLYLETTERS, INDEXF, INDEXL - INDEXF);

            IF LENGTH(ONEWORD) > 0  AND NOT FIND_IN_SET(ONEWORD, BADWORDS) THEN
                INSERT INTO `dictionary_words` VALUES (CONTENTID, ONEWORD);
                SET BADWORDS = CONCAT(BADWORDS, ',', ONEWORD);
            END IF;

            SET INDEXF = INDEXL + 1;
            SET INDEXL = LOCATE(' ', CONTENTONLYLETTERS, INDEXF);
        END WHILE;
    END IF;
END;

DROP TRIGGER IF EXISTS `insert_into_internal_content`;
CREATE TRIGGER insert_into_internal_content AFTER INSERT ON internal_content
  FOR EACH ROW BEGIN
    DECLARE CONTENTID BIGINT;
    DECLARE CONTENTNAME VARCHAR(255);
    SET CONTENTID = NEW.`id`;
    SET CONTENTNAME = NEW.`name`;
    CALL procedure_insert_into_internal_content(CONTENTID, CONCAT(CONTENTNAME, ' '));
 END;

DROP TRIGGER IF EXISTS `delete_from_internal_content`;
CREATE TRIGGER delete_from_internal_content BEFORE DELETE ON internal_content
  FOR EACH ROW BEGIN
    DELETE FROM `dictionary_words` WHERE `content_id` = OLD.`id`;
 END;

DROP TRIGGER IF EXISTS `update_into_internal_content`;
CREATE TRIGGER update_into_internal_content AFTER UPDATE ON internal_content
  FOR EACH ROW BEGIN
    DECLARE CONTENTID BIGINT;
    DECLARE CONTENTNAME VARCHAR(255);

    DELETE FROM `dictionary_words` WHERE `content_id` = OLD.`id`;

    SET CONTENTID = NEW.`id`;
    SET CONTENTNAME = NEW.`name`;
    CALL procedure_insert_into_internal_content(CONTENTID, CONCAT(CONTENTNAME, ' '));
 END;|
DELIMITER ;