首页 > 解决方案 > 在 mysql 中使用 webscraper 为数据库插入编写触发器......不断收到不同的错误

问题描述

我不是超级有经验,虽然我确实有一些 MySQL 经验。我有一个问题试图用触发器解决,但事实证明它比我想象的要复杂得多,希望得到一些建议。

我有两张桌子。表 A 和表 B。

我们收到了客户的请求,其中包含他们的数据。每一批新的请求都被网络抓取器抓取(这是我们唯一能做到的方法,所以忽略这个过程听起来有多奇怪),转储到 A,然后它应该去 B,去掉重复,然后根据数据向他们发送电子邮件。我看不到网络爬虫是如何插入数据的,所以它就出来了。

因为客户提交了多个请求或者同一个人有不同的请求,所以数据需要是唯一的,但不是唯一的。我们希望将每个请求记录为唯一请求,即使它来自同一客户。一些客户共享一个名字,或者他们返回一个不同的请求。

因此,我使表 B 具有唯一的主键:姓名、电子邮件、地址和注释。(如果我对唯一索引的看法是正确的,那么任何匹配的索引都会更新,如果有两个 John Smiths,这会很糟糕,所以它是主键)。

我已经尝试了不同的方法来做到这一点,在整个网站的多个线程上进行示例,但我已经在这个问题上几天了,我正在失去它!!!!我知道我做错了什么,但是什么?!我最终做的是:

TABLEA 上的触发器,AFTER_INSERT:

tableA_to_email 
    (
    customer_name, customer_email, customer_phone, customer_address)
    VALUES ((
    SELECT 
        new.customer_name
    FROM 
       tableA
    WHERE 
        customer_name = new.customer_name), 
    (
    SELECT 
        new.customer_email
    FROM 
        tableA
    WHERE 
        customer_email = new.customer_email),         
    (
    SELECT 
        new.customer_phone
    FROM 
        tableA
    WHERE 
        customer_phone = new.customer_phone), 
    (
    SELECT 
        new.customer_address
    FROM 
        tableA
    WHERE 
        customer_address = new.customer_address))
    
    ON DUPLICATE KEY UPDATE 
    customer_phone = VALUES(customer_phone)

输入一个空表: insert INTO tableA ( customer_name, customer_phone, customer_email, customer_address) VALUES("7", "0", "8", "0");

输出:MySQL 说:文档

1242 - 子查询返回多于 1 行

我理解错误,但上面的输入不超过一行?我在一张空桌子上试了一下,所以...

标签: mysqlinsertdatabase-trigger

解决方案


基本上,在您的方法中,您只能从您所做的所有选择中输入 1 个结果,显然您得到了一个包含多个成员的结果

所以

INSERT INTO tableA_to_email 
    (
    customer_name, customer_email, customer_phone, customer_address)
    VALUES ((
    SELECT 
        new.customer_name
    FROM 
       tableA
    WHERE 
        customer_name = new.customer_name LIMIT 1), 
    (
    SELECT 
        new.customer_email
    FROM 
        tableA
    WHERE 
        customer_email = new.customer_email LIMIT 1),         
    (
    SELECT 
        new.customer_phone
    FROM 
        tableA
    WHERE 
        customer_phone = new.customer_phone LIMIT 1), 
    (
    SELECT 
        new.customer_address
    FROM 
        tableA
    WHERE 
        customer_address = new.customer_address LIMIT 1))

    ON DUPLICATE KEY UPDATE 
    customer_phone = VALUES(customer_phone)

将毫无问题地运行,因为每个选择只返回 1 行

但你只能做

INSERT INTO tableA_to_email 
( customer_name, customer_email, customer_phone, customer_address)
VALUES (
    new.customer_name, 
    new.customer_email,         
    new.customer_phone, 
    new.customer_address
)
ON DUPLICATE KEY UPDATE 
customer_phone = VALUES(customer_phone)

这也有效


推荐阅读