Иногда на основании одних полей таблицы нужно при вставке сгенерировать и другие поля, этой же, либо иной таблицы. Например, имеется некая таблица 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