使用IF-THEN-ELSE触发语法错误

时间:2019-11-19 14:46:57

标签: mysql mariadb

我有四个桌子

  • Processor_products,其中包含列NameSocket
  • Motherboard,其中包含列NameSocket
  • Build,其中包含列Processor(引用Processor_products(Name)]和Motherboard [引用Motherboard(Name)]
  • Compatibility,其中包含列compatibleid

如果要插入Build的处理器和主板具有不同的插槽,或者如果它们具有相同的插槽,则插入“是”。我想编写在Compatibilty.compatible中插入“否”的触发器。

CREATE TRIGGER compatibility
AFTER INSERT ON build
BEGIN
IF ((SELECT * FROM build WHERE ORDER BY ID DESC LIMIT 1) EXISTS (SELECT * FROM processor_products pp, motherboard m where pp.Socket <> m.Socket))
THEN
INSERT INTO compatibility(compatibility) VALUE('no');
ELSE
INSERT INTO compatibility(compatibility) VALUE('yes');
END IF;
END

我正在使用phpmyadmin,错误是我的语法错误。

  

1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以在'BEGIN附近使用正确的语法       IF((SELECT * FROM构建WHERE ORDER BY ID DESC LIMIT 1)存在(SELECT *'位于第3行

有人可以帮我吗?

表格:

Build table = https://i.stack.imgur.com/wxviV.png
Motherboard = https://i.stack.imgur.com/7YNAo.png
Processors = https://i.stack.imgur.com/HOVjU.png

1 个答案:

答案 0 :(得分:1)

无需深入探讨语法问题;并且无需深入研究触发器要解决的实际问题;将所有讨论搁置一旁。

看起来触发器正在尝试:从socketmotherboard表中的相关行中检索“ processor”列的值,然后比较这两个字符串值,然后根据比较结果执行其他操作。


注意:

请勿使用ORDER BY ... DESC LIMIT 1标识刚刚插入的行。

在AFTER INSERT触发器的主体内,我们可以通过使用NEW关键字限定列名来引用刚插入的行的值。

例如,在触发器中,对NEW.motherboardNEW.processor的引用将分别返回该行的motherboardprocessor列的值(分别)插入(通过导致触发触发器的语句/行)。


这是我们编写执行这些操作的AFTER INSERT触发器的方法的证明:

DELIMITER $$

CREATE TRIGGER `trg_build_ai`
AFTER INSERT ON `build`
FOR EACH ROW
BEGIN

    -- local variables
    DECLARE ls_compatiblity VARCHAR(4)    DEFAULT NULL;
    DECLARE ls_p_socket     VARCHAR(1024) DEFAULT NULL;
    DECLARE ls_m_socket     VARCHAR(1024) DEFAULT NULL;

    -- get "socket" values from motherboard and processor
    SELECT m.socket AS m_socket
         , p.socket AS p_socket
      FROM ( SELECT 1 AS n ) i
      LEFT
      JOIN ( -- retrieve related motherboard "socket" value
             SELECT ms.socket
               FROM motherboard ms
              WHERE ms.name   = NEW.motherboard
              ORDER BY ms.name, ms.socket
              LIMIT 1
           ) m
      LEFT
      JOIN ( -- retrieve related processor "socket" value
             SELECT ps.socket
               FROM processor_product ps
              WHERE ps.name   = NEW.processor
              ORDER BY ps.name, ps.socket
              LIMIT 1
           ) p
      INTO ls_m_socket
         , ls_p_socket
    ;

    -- check if values are equal
    IF ( ls_m_socket = ls_p_socket ) THEN
       SET ls_compatibility := 'yes'; 
    ELSE
       SET ls_compatibility := 'no';
    END IF;

    -- (not even going to try to fathom why we need to INSERT into another table)
    INSERT INTO `compatibility` ( `compatibility` ) VALUES ( ls_compatibility );

 END$$

 DELIMITER ;