gpt4 book ai didi

MySQL:触发子句 "instead of update"

转载 作者:行者123 更新时间:2023-11-29 03:43:17 25 4
gpt4 key购买 nike

我正在尝试创建一个考虑历史的数据库(经验表明你总有一天会这样做)。

我在这里问过database-design-how-to-handle-the-archive-problem但没有比链接 here 更好的答案了.

我的问题是关于在哪里做代码和技术上,如何(MySQL 让我头疼)。首先,我开始在 Php 中执行此操作:在执行任何插入之前,复制记录并将其标记为“过时”,然后修改记录。

但是存在依赖性问题(也必须更新 manytomany 和 manytoone 关联),这意味着对表附带的所有依赖性和更新进行编码(以一种或另一种方式)(这是 Not Acceptable )。

所以我正在考虑在数据库服务器端完成所有工作。这将大大简化我的 Php 代码。

问题是我必须在修改当前记录之前“存档”它。为此,代码必须位于 trigger "before update" 中。 .

这是我的代码:

DELIMITER ;;

DROP TRIGGER IF EXISTS produit_trigger_update_before;

CREATE TRIGGER produit_trigger_update_before
BEFORE UPDATE ON produit
FOR EACH ROW BEGIN
/* */
INSERT INTO produit SET
id_origine = OLD.id_origine,
date_v_creation = OLD.date_v_creation,
date_v_start = OLD.date_v_debut,
date_v_end = NOW(),
...
last_record = OLD.last_record;

/* Dependancies : */
SET @last=LAST_INSERT_ID();
UPDATE categorie_produit SET id_produit=@last
WHERE id_produit = OLD.id;
UPDATE produit_attribut SET id_produit=@last
WHERE id_produit = OLD.id;
END;;

DELIMITER ;;

如果我让这段代码正常工作,我所有的问题都将迎刃而解。但是该死的,它不起作用:

mysql> update produit set importance=3;
ERROR 1442 (HY000): Can't update table 'produit' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
mysql> Bye

在此page有一个工作示例,它在触发器中使用 INSTEAD OF UPDATE 子句。 MySQL 似乎不支持这个。

所以我的问题是概念性的(=你有任何其他可行的“原则”)和/或技术性的(=你能让这个触发器起作用吗)。

最佳答案

If I get this code working, all my problems are gone. But damn it, it's not working:

通常,您不能在表 A 上使用触发器将触发器插入表 A - 因为这可能会导致无限循环。 (Oracle 术语中的触发突变)

就我个人而言,我不会使用触发器来执行此操作。触发器可以执行“审计日志记录”——但这不是您想要的。

我建议您以编程方式解决它 - 使用 PHP 函数或 MySQL 存储过程(无论您喜欢什么),您称之为“ModifyProduit”。

然后,代码基本上会执行您让上面的触发器执行的操作。 (在当前行上设置代码 date_v_end 可能更容易,然后插入一个全新的行。这样您就不必费心更新引用的表)

关于MySQL:触发子句 "instead of update",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10396604/

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