В чем проблема с этим триггером (для правильного синтаксиса, чтобы использовать рядом с '')

0

Пожалуйста, я сделал этот триггер, чтобы обновить rating таблицы после каждой вставки, когда 2 столбца (id_prof, id_etud) вставлены уже в таблице, но это дает mi эту ошибку

> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 6

Триггер:

CREATE TRIGGER Before_Insert_Rate
BEFORE INSERT ON rating
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT * FROM rating WHERE id_prof=NEW.id_prof and id_etud = NEW.id_etud)) THEN
    UPDATE 'rating' SET 'rate' = NEW.rate WHERE 'id_prof' = NEW.id_prof and 'id_etud' = NEW.id_etud; 
    ELSE INSERT INTO rating VALUES (NEW.idprof,New.rate,New.id_etud);
  END IF
END
DELIMITER ;
  • 0
    Уверен, что вы не можете изменить данные в таблице, на которой включен триггер; т. е. в триггере не допускается UPDATE, INSERT или DELETE для rating .
  • 0
    можешь объяснить больше?
Теги:
triggers

3 ответа

0
Лучший ответ

Я решил это, используя ON DUPLICATE KEY для запроса вместо триггера

CREATE TABLE 'rating' (
  'id_prof' int(11) NOT NULL,
  'rate' float NOT NULL,
  'id_etud' int(11) NOT NULL,
UNIQUE (id_prof,id_etud)
)

запрос:

INSERT INTO rating (id_prof,rate,id_etud) VALUES (1,2,5)
ON DUPLICATE KEY UPDATE rate=2
0

Вы должны установить DELIMITER раньше. Измените его на:

DELIMITER //
CREATE TRIGGER Before_Insert_Rate
BEFORE INSERT ON rating
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT * FROM rating WHERE id_prof=NEW.id_prof and id_etud = NEW.id_etud)) THEN
    UPDATE 'rating' SET 'rate' = NEW.rate WHERE 'id_prof' = NEW.id_prof and 'id_etud' = NEW.id_etud; 
    ELSE INSERT INTO rating VALUES (NEW.idprof,New.rate,New.id_etud);
  END IF
  END; //

DELIMITER ;
  • 0
    не работает: /
0

из официального справочника.

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

Это означает, что ни один запрос в таблице X может вставить INSERT, UPDATE или DELETE из таблицы X; это также означает, что если триггер в таблице X изменяет таблицу Y, он будет терпеть неудачу для любого запроса, используя обе таблицы X и Y которые "запускают" его.

Пример: UPDATE x INNER JOIN y ON x.id = y.id SET x.something = 1, y.something = 2 приведет к UPDATE x INNER JOIN y ON x.id = y.id SET x.something = 1, y.something = 2 начала BEFORE UPDATE ON x (который обновляет, вставляет или удаляет из y).

  • 0
    так в чем же решение?
  • 0
    Решение состоит в том, чтобы использовать другой подход, триггер не может делать то, что вы хотите. Возможно, вы захотите изучить использование запроса REPLACE INTO или предложение ON DUPLICATE KEY запроса INSERT.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню