我需要编写一个触发器,如果传入查询的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
感谢您的所有答案,我们非常感谢! : - )
答案 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