使用 MariaDB 循环在一个 table 中使用另一个 table 中的值插入行
Inserting rows in one table with values from another table in a loop with MariaDB
我需要在 MariaDB 10.1 中设置一个触发器,它会在另一个 table 中插入行。到目前为止,对于单个记录,触发器看起来像这样:
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
不是要插入的唯一记录,而是从另一个 table 获取的值列表。实际上我在触发器中需要这样的东西:
-- 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 循环,但我们还不能升级数据库。
您可以使用 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
,也无需更改分隔符。上面的简化版本应该就可以了。
我需要在 MariaDB 10.1 中设置一个触发器,它会在另一个 table 中插入行。到目前为止,对于单个记录,触发器看起来像这样:
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
不是要插入的唯一记录,而是从另一个 table 获取的值列表。实际上我在触发器中需要这样的东西:
-- 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 循环,但我们还不能升级数据库。
您可以使用 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
,也无需更改分隔符。上面的简化版本应该就可以了。