Вставка строк в одну таблицу со значениями из другой таблицы в цикле с MariaDB - PullRequest
1 голос
/ 29 октября 2019

Мне нужно настроить триггер в MariaDB 10.1, который вставляет строки в другую таблицу. Пока триггер выглядит так для отдельной записи:

DELIMITER //
CREATE TRIGGER generate_items
    AFTER INSERT
    ON my_table
    FOR EACH ROW
BEGIN
    -- some_id is the id from my_table
    INSERT INTO another_table(some_id, some_value)
    VALUES (NEW.id, 'x');
END;
//

DELIMITER ;

Моя проблема в том, что some_value - это не единственная запись, которую нужно вставить, а список значений, извлеченных из другой таблицы. На самом деле мне нужно что-то вроде этого в триггере:

-- Pseudo-code for illustrating
SET @values = SELECT value FROM some_table WHERE condition = true;
FOREACH(@value in @values) DO
  INSERT INTO another_table(some_id, some_value) VALUES (NEW.id, @value);
END

Какие возможности у меня были бы с MariaDB 10.1? Я читал, что MariaDB 10.3 предлагает цикл FOR, но мы еще не можем обновить базу данных.

1 Ответ

1 голос
/ 29 октября 2019

Вы можете использовать синтаксис insert ... select вместо insert ... values(). Так что-то вроде:

CREATE TRIGGER generate_items
    AFTER INSERT ON my_table FOR EACH ROW
    INSERT INTO another_table(some_id, some_value)
    SELECT NEW.id, value FROM some_table WHERE condition = true
;

Это вставит столько записей в another_table, сколько в some_table для заданных условий, получая value из запроса при назначении того же NEW.id длякаждая запись.

Примечание: поскольку триггер выполнен из одного запроса, нет необходимости использовать BEGIN и END, а также не изменять разделитель. Упомянутая упрощенная версия должна просто работать.

...