mySQL触发器 - 我的语法有什么问题?

时间:2014-07-31 14:45:39

标签: mysql if-statement sql-insert triggers

我需要编写一个触发器,如果​​传入查询的customerName与同义词表中的客户名称匹配,则该表中的customerID用于在customer表中查找客户。

我有一个工作触发器,它只搜索了客户表,但没有先搜索同义词表。我在想的是:(它是伪造的代码)

CREATE TRIGGER `Find Customer` AFTER INSERT ON `enquiry` FOR EACH ROW
BEGIN
    INSERT INTO customersmatched (enquiryID, customerID)
    SELECT NEW.id, id, customerName, customerID FROM customer, customerSynonyms WHERE
    customerSynonyms.customerName = NEW.companyName AND customer.id = customerSynonyms.customerID
    HAVING COUNT(id)=1
END;

我收到的错误:

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

但我知道这不起作用。

知道如何在mySQL中实现这个目标吗?谢谢!

更新

我也尝试过这种方式 - 它也没有用!

DELIMITER $$
CREATE TRIGGER Find_Customer AFTER INSERT ON enquiry
FOR EACH ROW
    BEGIN
        IF EXISTS (SELECT customerID FROM customerSynonyms WHERE customerName = NEW.companyName) THEN
            IF EXISTS (SELECT id FROM customer WHERE id = @customerID) THEN
                INSERT INTO customersMatched (enquiryID, customerID)
                HAVING COUNT(id)=1
            END IF;
        END IF;
    END$$
DELIMITER ;

更新2

事实证明,我对于让事情变得复杂而感觉很糟糕。 customerSynonym表将customerID存储在一列中,这是我真正需要的,因为我可以通过php使用customerID获取所有数据。有效的最终触发器非常简单:

INSERT INTO customersmatched (enquiryID, customerID)
SELECT NEW.id, customerID FROM customersynonyms WHERE
customersynonyms.customerName=NEW.companyName
HAVING COUNT(id)=1

感谢您的所有答案,我们非常感谢! : - )

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

CREATE TRIGGER Find_Customer AFTER INSERT ON enquiry FOR EACH ROW
BEGIN
    INSERT INTO customersmatched (enquiryID, customerID)
    SELECT NEW.id, customerID FROM customer, customerSynonyms 
        WHERE customerSynonyms.customerName = NEW.companyName 
        AND customer.id = customerSynonyms.customerID
        HAVING COUNT(id)=1
END;

有几点需要注意:

  • 我将触发器重命名为Find_Customer。我不能100%确定你是否可以在触发器名称中有空格

  • 我删除了Find_Customer和查询周围的单引号。单引号可以被mysql读取为字符串文字并导致问题。如果可能的话,最好避免这种情况。

  • 我将您的选择查询更改为仅选择NEW.id和customerID,因为这些只是您要插入的两件事。您可能需要更多地选择选择以获得您想要的结果。

  • 如果这只是触发器的一部分,并且您不仅仅是一个语句触发器,那么您需要设置分隔符。基本上,您在触发器定义之前有delimiter |,然后是END|而不是END

祝你好运!

相关问题