【问题标题】:Inserting data according to table linked by foreign key根据外键链接的表插入数据
【发布时间】:2018-12-27 05:13:08
【问题描述】:

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

现在我问自己:
如果机器正在发送数据(例如机器名称“5264”),数据库是否可以自动将“机器”表中的相应FK“机器ID”作为整数输入“机器1”而不是输入机器名称“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;

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

【问题讨论】:

  • 一个触发器可以有任意数量的插入,只要它们不是触发触发器的表。您可以设置新。插入前触发器中的值。您可能希望发布您的触发代码。
  • @P.Salmon 我添加了用于触发器的代码。也许你可以解释一下我必须改变它的工作原理。或者,也许您有一个更好的解决方案,可以在没有帮助表的情况下以我喜欢的方式插入数据(这里称为“transfer_data”)
  • 每条语句都需要终止,如果您的存储程序中有超过 1 条语句而不需要设置分隔符,请查看dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html
  • 我希望看到对 OLD 的引用。或新的。触发请求审查中的值dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

标签: mysql sql data-modeling opc-ua


【解决方案1】:

非常感谢@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 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2019-02-01
    相关资源
    最近更新 更多