Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法调用MySQL触发器_Php_Mysql_Mysqli - Fatal编程技术网

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的地址选择*
代替之前添加之后,它仍然输出相同的错误。地址表仅包含对城市表的引用。是否与引用约束有关?您是否已在地址上使用“删除后”创建触发器?是的,我已将“删除前”更改为“删除后”您可以尝试删除并再次创建触发器吗?谢谢,我将尝试