ON DELETE SET NULL TRIGGER DELETE

时间:2017-05-24 07:57:01

标签: mysql

if(!isInt(compressDuration.trim())) { System.out.println("The compressDuration has no value or a "); } else{ } public boolean isInt(String str) { try{ int num = Integer.parseInt(str); // is an integer! } catch (NumberFormatException e) { // not an integer! return false; } return true; } orders设置为user_id时,我创建了一个从restaurant_id删除行的触发器。

null

delimiter // create trigger order_delete before update on orders for each row if new.user_id is null and new.restaurant_id is null then delete from orders where order_id = new.order_id; end if; // delimiter ; user_id是来自其他两个表的外键,当从各自的表中删除它们时将设置为null。但是,当我尝试从表中删除它时,它不会执行触发器。所以我的订单表中仍然有两个restaurant_iduser_id = NULL的订单。有谁知道为什么我的触发器没有触发?

2 个答案:

答案 0 :(得分:1)

正如foreign keys上的MySQL文档所说:

  

级联外键操作不会激活触发器

因此,没有你创建的触发器,当通过级联将值设置为null时,不会调用它。

如果您只想删除记录,如果两个字段都设置为null,那么您必须从应用程序代码执行此操作,您不能依赖数据库自动化。

请注意:您不应该删除系统中的订单,因为它们是您的财务交易的基础,您可能会遇到税务机关和外部财务审计师的麻烦。

答案 1 :(得分:-1)

您希望在user_idrestaurant_id设置为NULL时触发该触发器吗?

在这种情况下,您应该使用:

delimiter //
create trigger order_delete
after update on orders
for each row
if new.user_id is null and new.restaurant_id is null then
delete from orders where order_id = new.order_id;
end if;
//
delimiter ;

使用关键字after代替before表示在字段设置为null后触发器将被触发。使用before时,user_idrestaurant_id仍有其先前值时会触发触发器。在这种情况下,if语句中的条件永远不会成立。