代码之家  ›  专栏  ›  技术社区  ›  Amine Choukri

此触发器有什么问题(对于在“”附近使用的正确语法)

  •  0
  • Amine Choukri  · 技术社区  · 8 年前

    拜托,我做这个触发器是为了更新表 rating 每次插入后,插入的2列(id\u prof,id\u 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 ;
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   Bernd Buffen    8 年前

    您必须设置 分隔符 之前将其更改为:

    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 ;
    
        2
  •  0
  •   Uueerdo    8 年前

    从…起 the official reference manual .

    触发器可以访问自己表中的新旧数据。触发器 也会影响其他表,但 不允许修改 已被(用于读或写)使用的表 调用函数或触发器的语句。

    这意味着表上没有查询 X 可以从表中插入、更新或删除 十、 ; 这也意味着如果表上的触发器 十、 修改表格 Y ,对于使用这两个表的任何查询都将失败 十、 和 Y 这“触发”了它。

    例子: UPDATE x INNER JOIN y ON x.id = y.id SET x.something = 1, y.something = 2 将导致 BEFORE UPDATE ON x 触发器(更新、插入或删除 y )失败。

        3
  •  0
  •   Amine Choukri    8 年前

    我用 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