Mysql: установка значений из других полей при вставке в таблицу. Триггеры и переменные.

Иногда на основании одних полей таблицы нужно при вставке сгенерировать и другие поля, этой же, либо иной таблицы. Например, имеется некая таблица questions с автоинкрементом поля id, то есть при вставке, это значение нам не известное. На основании этого поля, нужно внести в таблицу идентичное int поле question_id тот же самый id строки, а в поле url_0tvet внести строку типа question(id+1)

Бл@ть… Ну вот нужно. Такая вот структура нужна заказчику под его скрипт. И делать это необходимо не вызывая дополнительных UPDATE, а сразу же при вставке данных. Выполняется эта задача добавлением следующего триггера для таблицы:

CREATE TRIGGER `inserts` BEFORE INSERT ON `questions`
 FOR EACH ROW BEGIN
DECLARE question_id INT(11);
DECLARE url_0tvet VARCHAR(255);
SET question_id = (SELECT IFNULL(MAX(`id`), 0) + 1 FROM `questions`);
SET url_0tvet = CONCAT('question', (question_id + 1));
SET NEW.question_id = question_id, NEW.url_0tvet = url_0tvet;
END

Тут мы объявили пару переменных в триггере, задали им значения и установили их при вставке в таблицу. Собственно суть хотелок такая была:

Добавим в триггер ещё рандом для требуемого поля уже известным способом. Триггер будет выглядеть так:

CREATE TRIGGER `inserts` BEFORE INSERT ON `questions`
 FOR EACH ROW BEGIN
DECLARE question_id INT(11);
DECLARE url_0tvet VARCHAR(255);
SET question_id = (SELECT IFNULL(MAX(`id`), 0) + 1 FROM `questions`);
SET url_0tvet = CONCAT('question', (question_id + 1));
SET NEW.question_id = question_id, NEW.user_id_0tvet = (FLOOR(10+RAND()*50000)), NEW.url_0tvet = url_0tvet;
END

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *