gpt4 book ai didi

mysql - 无法创建 MySQL/MariaDB 存储过程

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:50 25 4
gpt4 key购买 nike

我有一个包含 20 万条记录的 XML 文件。我必须插入或更新数据库中的记录。我的数据库结构如下:

+----+------+-------+-----+-----+------------+
| Id | name | stock | sku | ean | updated_by |
+----+------+-------+-----+-----+------------+

为了插入记录,我使用了 Doctrine。但是需要很长时间才能插入或更新所有记录。因此我想创建一个存储过程。

我尝试了以下存储过程,但它不起作用。

delimiter $$
create trigger insert
before insert on Product
for each row
begin
IF(exists(select 1 From Product WHERE sku = new.sku))
THEN
BEGIN
UPDATE Product SET stock = new.stock WHERE sku = sku;
END;
END IF;
end$$
delimiter

错误:

General error: 1442 Can't update table 'Product' in stored function/trigger because it is already used by statement which invoked this stored function/trigger

更新:

最佳答案

您不能按照您描述的方式使用 MySQL 触发器。您不能更新为其定义了触发器的表。这将导致无限循环。

即使您编写的触发器代码有效,MySQL 也不支持“代替”触发器。也就是说,它会执行 UPDATE,但随后它也会尝试 INSERT。因此,它会创建具有相同 sku 值的另一行,否则如果您对 sku 有唯一约束,插入将导致错误并回滚 INSERT并从触发器运行更新。

这就是为什么 REPLACEINSERT...ON DUPLICATE KEY UPDATE陈述存在。

我知道您想对所有操作使用 ORM 方法,但这将是一般规则的一个很好的例子:ORM 不支持所有操作。您不可避免地会遇到这样的情况如果您想做一些特别的事情,请编写 SQL。与所有 ORM 库一样,Doctrine 支持一种绕过 ORM 方法运行文字 SQL 语句的方法。

参见 Doctrine: ON DUPLICATE KEY UPDATE例如。

关于mysql - 无法创建 MySQL/MariaDB 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837037/

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