我需要编写一个触发器,如果传入查询的 customerName 与同义词表中的客户名称匹配,则使用该表中的 customerID 在客户表中查找客户。
我有一个触发器可以工作,它只搜索客户表,但不首先搜索同义词表。我在想这样的事情:(这是伪代码)
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
感谢您的所有回答,我们非常感谢! :-)
最佳答案
我想你想要这样的东西:
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 和 enquiry 周围的单引号。单引号可能会被 mysql 读取为字符串文字并导致问题。如果可能的话最好避免这种情况。
我将您的选择查询更改为仅选择 NEW.id 和 customerID,因为这是您要插入的唯一两个内容。您可能需要多尝试一下选择才能完全达到您想要的效果。
如果这只是触发器的一部分,并且您有多个单语句触发器,则需要设置分隔符。基本上,您可以在触发器定义之前使用
delimiter |
,然后使用END|
而不是END
祝你好运!
关于mySQL 触发器 - 我的语法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061937/