Вставка данных в соответствии с таблицей, связанной внешним ключом - PullRequest
0 голосов
/ 20 декабря 2018

Я собираю данные, которые генерируются машиной.В настоящее время я использую программный маршрутизатор OPC для передачи данных машины через OPCUA в базу данных MySQL, управляемую phpMyAdmin.Чтобы увеличить производительность и уменьшить объем используемой памяти, я подумал о моделировании БД как-то так:

enter image description here

Теперь я спрашиваю себя:
Еслимашина отправляет данные (например, имя машины "5264"), может ли база данных автоматически ввести соответствующий FK "machine_ID" из таблицы "machines" в "machine1" в виде целого числа вместо ввода имени машины "5264"?

Я уже пытался сначала записать данные в дополнительную таблицу, а затем вставить триггер после вставки.Этот триггер должен затем выполнить команду вставки для каждого столбца в соответствующие таблицы с соответствующими идентификаторами вместо полных имен.Здесь я потерпел неудачу, потому что не смог выполнить более одной команды вставки в одном триггере, хотя я использовал 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 голосов
/ 27 декабря 2018

Большое спасибо @ 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 ;
...