1

我发现了很多关于这个的讨论,似乎 mySQL 根本不允许使用递归触发器。其他讨论建议不要尝试这样做,但我对触发器的设计相当有信心,因此它不会冒无限循环的风险。

我想我是在要求确认 mySQL 中的这种限制/设计选择,以及对我想要实现的替代方法的任何建议。

- -'问题' - -

总而言之,我有一个数据库,其中包含一个联系人/用户表,以及一些“信息”表,例如地址/电话/电子邮件。出于这个问题的目的,我将只关注地址。地址表有一个contact_id col,用于指定它属于哪个联系人。

为了快速澄清,联系人可以将非对多地址附加到他们的帐户,这就是我将该信息分隔到单个表的原因。

当用户登录他们的帐户时,我会进行查询以获取带有他们的contact_id的地址列表,然后允许他们编辑/删除它/添加新条目等。

我现在想为联系人指定一个主要地址,因此在完成订单时,他们可用地址的下拉列表默认为他们的主要地址。

我正在尝试设置地址更新触发器,因此如果 is_primary col 从 0/false 更新为 1/true 它也会更新以前的主地址。

本质上,我只希望地址表中的每个contact_id 有1 行能够将is_primary 设置为1/true。

- -方法 - -

我写了下面的触发器(我在更新前后都试过了)

CREATE TRIGGER tr_addresses_primary_bu 

BEFORE UPDATE ON addresses 

FOR EACH ROW 

BEGIN

    IF OLD.is_primary = 0 AND NEW.is_primary = 1 THEN

        UPDATE addresses

        SET addresses.is_primary = 0

        WHERE addresses.is_primary = 1 

        AND addresses.contact_no = NEW.contact_no;

    END IF;

END;

(请暂时忽略多个 ';' 分隔符的情况)

我相信触发器应该是正确的。

  • 更新地址之前

  • 如果 is_primary 从 0/false 变为 1/true(即它成为主要的)

  • 将具有相同 contact_id 的主地址的 is_primary 更改为 0/false (is_primary = 1/true)

MySQL(通过 phpmyadmin 访问)允许我添加触发器,但在触发器运行时抛出错误(当我将行 is_primary 从 0 更新为 1 时)。

---为什么我认为我的方法应该有效---

我理解为什么在更新同一个表时调用的触发器内的更新表语句可能会导致问题。但我认为这应该留给设计师。

此触发器不可能遇到无限循环,因为“内部”更新语句将始终将 OLD.is_primary = 1 更新为 NEW.is_primary = 0,并且触发器更新查找 OLD.is_primary = 0 到 NEW.is_primary = 1。

知道 mySQL 无法控制我做我需要做的事情,让我免于我已经考虑和解决的可能问题,这有点令人沮丧。

- -问题 - -

有谁知道我如何让这个触发器在 mySQL 中起作用?

有人看到我可能忽略的触发器有问题吗?

或者有没有人建议实施我所描述的情况?

我知道我可以添加一个 primary_addresses 表,并在触发器中更改它。但我真的很想避免添加单独的表格。但我想如果它能够实现我需要的功能,我应该考虑一下。

4

0 回答 0