我发现了很多有关此问题的讨论,而且看来mySQL根本不允许使用递归触发器。 其他讨论建议不要尝试执行此操作,但是我对触发器的设计非常有信心,因此不会冒无限循环的风险。
我想我正在寻求有关mySQL中这种限制/设计选择的确认,以及有关我尝试实现的替代方法的任何建议。
---'问题'---
总而言之,我有一个数据库,其中包括一个联系人/用户表和一些“信息”表,例如地址/电话/电子邮件。 出于这个问题的目的,我将只关注地址。 地址表有一个contact_id col,用于指定它属于哪个联系人。
为快速澄清,联系人可以在其帐户中附加多个地址,这就是为什么我将这些信息分离到一个单独的表中的原因。
当用户登录其帐户时,我进行查询以获取带有他们的contact_id的地址列表,然后允许他们对其进行编辑/删除/添加新条目等。
我现在想为联系人指定一个主要地址,因此在完成订单时,其可用地址的下拉列表默认为主要地址。
我正在尝试在地址更新上设置触发器,因此,如果is_primary col从0 / false更新为1 / true,它也会更新以前的主地址。
基本上,我只希望地址表中每个contact_id 1行才能将is_primary设置为1 / true。
--- APPROACH ---
我编写了以下触发器(在更新之前和之后都尝试过)
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(即以它为主要对象)
将is_primary更改为0 / false 相同contact_id的主地址(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表,并在触发器内对其进行更改。 但我真的很想避免添加单独的表。 但是我想如果它能够实现我需要的功能,我应该考虑一下。