gpt4 book ai didi

mysql - 批量插入完成后如何启动MYSQL触发器?

转载 作者:行者123 更新时间:2023-11-29 06:30:38 25 4
gpt4 key购买 nike

我有批量插入作业,插入超过 1000 条记录,并根据插入的值,我将使用插入触发器插入到另一个表中。

但是触发表中插入的每一行。所以我得到了重复的值。请告知如何防止每行触发或任何其他替代方法来处理用例。

 CREATE DEFINER=`root`@`localhost` TRIGGER `cost_AFTER_INSERT` AFTER INSERT ON `cost` FOR EACH ROW BEGIN
INSERT INTO `finance`.`finance_master`
(`Source`,
`January`,
`February`,
`March`,
`April`,
`May`,
`June`,
`July`,
`August`,
`September`,
`October`,
`November`,
`December`)
select ref.name,ref.owner,ref.department_id,c.source
c.Jan,
c.Feb,
c.Mar,
c.Apr,
c.May,
c.Jun,
c.Jul,
c.Aug,
c.Sep,
c.Oct,
c.Nov,
c.Dec
from cost as c ,reference as ref where c.name = ref.name;

END

最佳答案

您获得重复项的原因是触发器在每次插入后运行完全相同的语句,而不引用您刚刚插入的记录。根据您的帖子,您似乎想将每个新记录复制到不同的表中。因此,您应该使用关键字“new”来引用您尝试插入的记录。像这样的东西:

 CREATE DEFINER=`root`@`localhost` TRIGGER `cost_AFTER_INSERT` AFTER INSERT ON `cost` FOR EACH ROW BEGIN
INSERT INTO `finance`.`finance_master`
(`Source`,
`January`,
`February`,
`March`,
`April`,
`May`,
`June`,
`July`,
`August`,
`September`,
`October`,
`November`,
`December`)
select new.source
new.Jan,
new.Feb,
new.Mar,
new.Apr,
new.May,
new.Jun,
new.Jul,
new.Aug,
new.Sep,
new.Oct,
new.Nov,
new.Dec
from reference as ref where new.name = ref.name;

END

此外,我注意到表“引用”不是触发器的 select 子句的一部分,那么它真的需要存在吗?如果您的目标是复制每条记录,那么您可能会错过一些不在引用表中的记录。最终,这仅取决于您想要做什么。

说了这么多,您确定要首先使用触发器吗?由于您使用的是批量插入,我认为性能很重要,并且在每次插入后运行触发器对您的性能根本没有帮助。插入所有数据后,禁用/删除触发器并只使用一个复制语句会更好吗?这肯定会带来更好的性能。

关于mysql - 批量插入完成后如何启动MYSQL触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56464074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com