我正在收集机器生成的数据。目前,我使用OPC路由器将机器数据通过OPCUA传输到由phpMyAdmin管理的MySQL数据库中。为了提高性能并减少使用的存储空间,我想到了以某种方式对数据库进行建模:
现在我问自己: 如果机器正在发送数据(例如机器名称“5264”),数据库是否可以自动从“机器”表中将相应的FK“machine_ID”输入“machine1”作为整数而不是输入机器名称“5264”?
我已经尝试先在额外的表中写入数据,然后在插入后插入一个触发器。然后,此触发器应对每个列执行insert命令,使用匹配的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!我现在使用以下代码使其工作:
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 ;