SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.05.2010 09:59:38

fnick
Участник
Зарегистрирован: 05.05.2010
Сообщений: 3

Ветвление в триггере

Доброго времени суток, коллеги.

DELIMITER |
CREATE TRIGGER update_last_proj_art_nr AFTER INSERT ON projectbook
FOR EACH ROW BEGIN
      IF (SELECT `year`, `month` FROM last_proj_art_nr WHERE `year` = YEAR(CURDATE()) AND `month` = MONTH(CURDATE())) THEN
          UPDATE last_proj_art_nr
          SET number = number + 1
          WHERE `year` = YEAR(CURDATE()) AND `month` = MONTH(CURDATE());
      ELSE
        INSERT INTO last_proj_art_nr (`year`, `month`, `number`)
        VALUES (YEAR(CURDATE()), MONTH(CURDATE()), 1);
      END IF;
END
|
 


Этот триггер должен обновлять записи в таблице last_proj_art_nr, если записи есть, и создавать противном случае.

При выполнении (корректного) SQL выражения, вставляющего данные в таблицу projectbook, возникает ошибка: Operand should contain 1 column(s)

Если триггер удалить, то вставка происходит нормально. Однако, хотелось бы обновление таблицы автоматизировать и сэкономить на коде в программе.

Буду очень признателен, если кто-то сможет подсказать альтернативный вариант триггера.

Неактивен

 

#2 05.05.2010 12:06:37

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Ветвление в триггере

Код:

IF (SELECT  `year`, `month` FROM last_proj_art_nr WHERE  `year` = YEAR(CURDATE()) AND  `month` = MONTH(CURDATE()))  THEN

А это что?

Может так будет работать:

Код:

CREATE TRIGGER update_last_proj_art_nr AFTER INSERT ON projectbook
FOR EACH ROW BEGIN
  declare y YEAR default YEAR(CURDATE());
  declare m INT default MONTH(CURDATE());
  declare ry YEAR;
  declare rm INT;

  SELECT `year`, `month` into ry, rm FROM last_proj_art_nr
    WHERE `year` = y AND `month` = m;

   if ((ry is not NULL) and (rm is not NULL)) THEN
      UPDATE last_proj_art_nr
      SET number = number + 1
      WHERE `year` = y AND `month` = m;
    ELSE
      INSERT INTO last_proj_art_nr (`year`, `month`, `number`)
      VALUES (y, m, 1);
  END IF;
END;

Или так:

Код:

CREATE TRIGGER update_last_proj_art_nr AFTER INSERT ON projectbook
FOR EACH ROW BEGIN
  declare y YEAR default YEAR(CURDATE());
  declare m INT default MONTH(CURDATE());

  UPDATE last_proj_art_nr
    SET number = number + 1
  WHERE `year` = y AND `month` = m;

  if (ROW_COUNT() < 1) then
      INSERT INTO last_proj_art_nr (`year`, `month`, `number`)
      VALUES (y, m, 1);
  end if;
END;

Отредактированно Артём Н. (05.05.2010 12:11:38)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#3 05.05.2010 14:08:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Ветвление в триггере

Ну да, еще есть хорошее слово EXISTS(), которое подходит сюда по
логике. Но для конкретной задачи я бы рекомендовал использовать

INSERT INTO last_proj_art_nr (YEAR(CURDATE()), MONTH(CURDATE()), 1)
ON DUPLICATE KEY UPDATE number = number + 1

Неактивен

 

#4 05.05.2010 15:15:20

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Ветвление в триггере

Блин, точно. Забыл про ON DUPLICATE KEY. Я туп. sad


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#5 08.05.2010 19:07:49

fnick
Участник
Зарегистрирован: 05.05.2010
Сообщений: 3

Re: Ветвление в триггере

Спасибо, работает!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson