@LebedevStr

Как сделать мульти триггер в PMA?

Здравствуйте. Подскажите пожалуйста.

Исходные данные.

Имя базы: db_name
Имя таблицы: table_name
Имя столбца: line_name

Line_name
Содержит данные со словами, от 3 до 10.

Задача.
Сделать триггер на столбец line_table с такой функцией

1) Содержал первые три слова
2) Включить блэк-лист слов

Пример.

Было: сколько весит взрослый слон ответ четыре тонны
Стало: весит взрослый слон

*"сколько" - попадает под блэк лист.

Тоесть нужно отфильтровать количество слов с возможностью введения блэк-листа.

Спасибо!
  • Вопрос задан
  • 199 просмотров
Пригласить эксперта
Ответы на вопрос 1
mahoho
@mahoho
Full stack certified PHP developer.
Решение с помощью MySQL будет, мягко говоря. не очень изящным из-за весьма убогого функционального набора.
Нам потребуется вспомогательная функция удаления лишних пробелов:
CREATE FUNCTION DELETE_DOUBLE_SPACES ( title VARCHAR(250) )
	RETURNS VARCHAR(250) DETERMINISTIC
	BEGIN
		DECLARE result VARCHAR(250);
		SET result = REPLACE( title, '  ', ' ' );
		WHILE (result <> title) DO
			SET title = result;
			SET result = REPLACE( title, '  ', ' ' );
		END WHILE;
		RETURN result;
	END;

Таблица для хранения стоп-слов:
create table stop_words(
	word VARCHAR(20) NOT NULL ,
	PRIMARY KEY (word)
) ENGINE = InnoDB CHAR SET utf8 COLLATE utf8_general_ci;

И собственно сам триггер BEFORE INSERT:
CREATE TRIGGER check_column BEFORE INSERT ON table_name FOR EACH ROW
	BEGIN
		DECLARE var_censored_string VARCHAR(255);
		DECLARE done BOOLEAN DEFAULT false;
		DECLARE var_current_stop_word VARCHAR(20);

		DECLARE stop_words_list CURSOR FOR select word from stop_words;
		DECLARE CONTINUE HANDLER FOR NOT FOUND set done = true;

		SET var_censored_string = NEW.line_name;

	  -- убираем стоп-слова
		OPEN stop_words_list;
		`IterateStopWords`: LOOP
			FETCH `stop_words_list` INTO var_current_stop_word;
			IF done THEN
				LEAVE `IterateStopWords`;
			END IF;

			SET var_censored_string = REPLACE(var_censored_string, var_current_stop_word, '');

		END LOOP `IterateStopWords`;

		-- убираем лишние пробелы
		SET var_censored_string = trim(DELETE_DOUBLE_SPACES(var_censored_string));

		-- берем первые три слова
		SET var_censored_string = SUBSTRING_INDEX(var_censored_string, ' ', 3);

		SET NEW.line_name = var_censored_string;
	END;

Аналогичный для BEFORE UPDATE, если нужен. А вообще проще это в php сделать, потому что там explode() есть, который по-людски работает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы