【问题标题】:mySQL trigger - What is wrong with my syntax?mySQL 触发器 - 我的语法有什么问题?
【发布时间】:2014-07-31 14:45:38
【问题描述】:

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

感谢您的所有回答,他们总是非常感谢! :-)

【问题讨论】:

  • INSERT INTO <2 fields> ... SELECT <4 fields> 这不适合在一起。
  • 您能否成功地在触发器中自行运行查询?
  • 我已经用我找到的解决方案更新了我的问题。这比我最初尝试做的任何事情都简单得多! :-P

标签: mysql if-statement sql-insert triggers


【解决方案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

祝你好运!

【讨论】:

  • 非常感谢您的详细回复!我明天早上第一件事就试试看。我正在通过 phpMyAdmin 运行它,因此我可以将分隔符设置为仅针对此查询的其他内容,它应该可以正常运行!再次感谢!如果我在途中遇到任何颠簸,我会告诉你的!
  • 所以我把它作为触发器编译得很好,尽管逻辑似乎不起作用。有没有更好、更简洁的方法 - 如果我在 customerSynonyms 表中找到 customerName 匹配,然后从同一行获取 customerID,然后使用它在 customer 表中查找客户?我的代码如下: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 谢谢!
  • 我建议使用内部连接。它干净且易于阅读。我认为您想要的是这样的:SELECT NEW.id, customerID FROM customer INNER JOIN customerSynonyms ON customer.id = customerSynonyms.customerID WHERE customerSynonyms.customerName = NEW.companyName HAVING COUNT(customer.id)=1 如果这不起作用,请尝试运行常规 SELECT(您必须将 NEW 值替换为对选择有意义的值)并查看是否得到值返回,或者如果您从错误消息中获得有用的输出。
  • 感谢偏执狂的回复。事实证明我把事情复杂化了。检查我更新的问题以获得我的解决方案!谢谢!
猜你喜欢
  • 2017-12-24
  • 2011-08-16
  • 2018-03-21
  • 2013-12-06
  • 2018-02-27
  • 2015-12-02
  • 2011-02-11
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多