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

标签 mysql if-statement sql-insert triggers

我需要编写一个触发器,如果​​传入查询的 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/

相关文章:

SQL 行插入表 + 键在一条语句内插入其链接表(多对多关系)

java - 不区分大小写的输入和任何改进建议

if-statement - FORALL Oracle 中的 IF ELSE 条件

sql - 在 Oracle 中进行多行插入的最佳方法?

mysql - 如何遍历 SQL 查询并在每次迭代期间更改一个参数

mysql - 如果两列具有特定值,如何设置值?

mysql - 创建表并在数据库浏览器中插入值(sqlite)

sql - upsert 到表,返回最后插入的记录的 id

php - 为什么 Controller 路由返回时不保存多个图像?

razor - IF 条件中值之间的白色(空白、空)空间 { }