根据外键链接的表插入数据

时间:2018-12-20 08:47:59

标签: mysql sql data-modeling opc-ua

我正在收集机器生成的数据。目前,我使用软件OPC Router通过OPCUA将机器数据传输到由phpMyAdmin管理的MySQL数据库中。为了提高性能并减少使用的存储,我想到了对数据库进行建模的方式:

enter image description here

现在我要问自己:
如果机器正在发送数据(例如,机器名称“ 5264”),数据库是否可以将整数从“机器”表中自动输入相应的FK“机器ID”到“ machine1”中而不是输入机器名称“ 5264”?

我已经尝试过先将数据写入额外的表中,然后在其中插入触发器后再插入。然后,此触发器应使用匹配的ID(而不是全名)为根据表的每一列执行插入命令。在这里,我失败了,因为即使使用BEGIN和END,也无法在一个触发器中执行多个插入命令。

我用于触发器的代码如下:

BEGIN
    INSERT INTO products(Name)
        SELECT t1.Product_Name
        FROM transfer_data t1
        WHERE NOT EXISTS(SELECT products.Name
                    FROM products t2
                   WHERE t2.Name = t1.Product_Name)

    INSERT INTO operators
        (operators.First_Name, operators.Last_Name)
        SELECT t1.Operator_First_Name, t1.Operator_Last_Name
        FROM transfer_data t1
        WHERE NOT EXISTS(SELECT operators.First_Name, operators.Last_Name
                     FROM operators t2
                     WHERE t2.First_Name = t1.Operator_First_Name
                     AND t2.Last_Name = t1.Operator_Last_Name)
END;

期待听到您对我的计划的意见,并希望能获得一些帮助。

1 个答案:

答案 0 :(得分:0)

非常感谢@ P.Salmon!我现在使用以下代码使其工作:

Delimiter //

Create trigger this_one after insert on transfer_data
For each row

    BEGIN
        INSERT INTO products(Name)
            SELECT t1.Product_Name
            FROM transfer_data t1
            WHERE NOT EXISTS(SELECT products.Name
                        FROM products t2
                    WHERE t2.Name = t1.Product_Name);

        INSERT INTO operators
            (operators.First_Name, operators.Last_Name)
            SELECT t1.Operator_First_Name, t1.Operator_Last_Name
            FROM transfer_data t1
            WHERE NOT EXISTS(SELECT operators.First_Name, operators.Last_Name
                    FROM operators t2
                    WHERE t2.First_Name = t1.Operator_First_Name
                    AND t2.Last_Name = t1.Operator_Last_Name);
    END
    //

delimiter ;