Php 无法调用MySQL触发器
创建触发器成功Php 无法调用MySQL触发器,php,mysql,mysqli,Php,Mysql,Mysqli,创建触发器成功 mysqli_query($this->conn, "CREATE TRIGGER `before_delete_address` BEFORE DELETE ON address FOR EACH ROW DELETE FROM city WHERE cityid = OLD.cityid"); 但是当我执行下面的查询时 DELETE FROM address WHERE addressid = 18 它输出以下错误代码 Error Code:
mysqli_query($this->conn,
"CREATE TRIGGER `before_delete_address`
BEFORE DELETE ON address FOR EACH ROW
DELETE FROM city WHERE cityid = OLD.cityid");
但是当我执行下面的查询时
DELETE FROM address WHERE addressid = 18
它输出以下错误代码
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`gamecomp`.`address`, CONSTRAINT `cityid` FOREIGN KEY (`cityid`) REFERENCES `city` (`cityid`) ON UPDATE CASCADE) 0.039 sec
地址表上的约束设置为“更新时级联”和“删除时限制”
地址表的列有addressid、address、cityid、zipcode、cityid是对包含cityid、city、countryid的city表的FK引用
有人能指出我做错了什么吗?感谢您,而不是在城市上删除之前在地址上删除之后使用地址外键cityid引用城市cityid ON DELETE RESTRICT意味着您不能删除任何address.cityid引用的城市。因为这正是触发器所做的,所以会出现外键约束错误 即使启用此触发器后删除,您可能仍然有其他引用城市的地址行,这意味着您可能仍然会遇到外键约束错误。您还应该验证city表上没有可能会破坏address中外键约束的触发器 在删除相应的城市之前,您需要首先验证对城市ID的所有引用是否已消失。坦白说,我不认为你应该这么做。在设计良好的模式中,一些孤立记录不应该是问题。如果它们确实给您带来麻烦,可以使用cronjob定期删除它们,而不是使用触发器 如果您坚持使用触发器,请尝试以下操作: 创建触发器“删除城市”` 删除每行的地址后 从city.id=OLD.cityid的城市中删除 并且不存在从cityid=OLD.cityid的地址选择*
代替之前添加之后,它仍然输出相同的错误。地址表仅包含对城市表的引用。是否与引用约束有关?您是否已在地址上使用“删除后”创建触发器?是的,我已将“删除前”更改为“删除后”您可以尝试删除并再次创建触发器吗?谢谢,我将尝试