0

创建触发器成功

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

地址表的约束设置为On Update cascadeOn Delete restrict

地址表的列是addressid, address, cityid, zipcode,cityid 是对包含的城市表的 FK 引用cityid, city, countryid

有人可以指出我做错了什么吗?谢谢

4

2 回答 2

2

address FOREIGN KEY (cityid) REFERENCES city (cityid) ON DELETE RESTRICT意味着您不能删除任何address.cityid引用的城市。由于这正是您的触发器所做的,因此您会收到外键约束错误。

即使您将此触发器设为AFTER DELETE ON,您可能仍然有其他引用城市的地址行,这意味着您可能仍然会收到外键约束错误。您还应该验证表上没有触发器,city这可能会破坏address.

cityid删除相应的city. 坦率地说,我不相信你甚至应该尝试这样做。在设计良好的模式中,一些孤立的记录不应该成为问题。如果它们真的给您带来麻烦,可以使用 cronjob 定期删除它们,而不是使用触发器。

如果你坚持触发,试试这个:

CREATE TRIGGER `delete_city_orphans`
AFTER DELETE ON address FOR EACH ROW
DELETE FROM city WHERE city.id=OLD.cityid
   AND NOT EXISTS (SELECT * FROM address WHERE cityid=OLD.cityid)
于 2013-04-03T07:01:57.443 回答
0

而不是 BEFORE DELETE ON city 使用 AFTER DELETE ON 地址

于 2013-04-03T06:36:53.923 回答