У меня есть большая таблица с идентификатором учетной записи, идентификатором устройства, отметкой времени в качестве первичных ключей и множеством полей с разными типами данных. Таблица очень активна, новые от 50 до 80 строк добавляются каждую секунду сервером JAVA, который получает данные из Интернета.

Теперь мне нужно клонировать несколько новых строк при вставке новой строки с определенным идентификатором учетной записи и идентификатором устройства и изменить поле идентификатора учетной записи на клоне на новое.

Я новичок в триггерах MySQL. Может ли спусковой крючок выстрелить сам? «Мне не нужен сам триггер, но поскольку клонированная строка будет добавлена ​​в ту же таблицу, возможно, это произойдет», - подумал я.

1
E_Blue 25 Окт 2019 в 17:03

1 ответ

Лучший ответ

Вы не можете сделать это внутри триггера, потому что триггер не может выполнять запросы к таблице, для которой он был запущен.

Одним из решений может быть создание хранимой процедуры, которую ваше приложение будет вызывать, когда ему нужно вставить данные. Затем процедура вставит две записи.

Так что-то вроде:

DELIMITER $$

CREATE PROCEDURE my_insert_proc(
    IN p_accountID INT, 
    IN p_deviceID INT, 
    IN p_timestamp DATETIME,
    IN p_col1 VARCHAR(20),
    IN p_col2 VARCHAR(50)
)
BEGIN
    DECLARE p_accountID_new INT;

    -- "regular" insert
    INSERT INTO mytable(accountID, deviceID, timestamp, col1, col2) 
        VALUES(p_accountID, p_deviceID, p_timestamp, p_col1, p_col2);

    SET p_accountID_new = ... -- whatever you need
    -- "clone" insert
    INSERT INTO mytable(accountID, deviceID, timestamp, col1, col2) 
        VALUES(p_accountID_new, p_deviceID, p_timestamp, p_col1, p_col2);
END
$$

DELIMITER ;

Это предполагает, что в таблице есть два дополнительных столбца после столбцов первичного ключа. Вы можете адаптировать это в соответствии со структурой вашей таблицы.

0
GMB 25 Окт 2019 в 14:23