Mysql删除外键时删除所有记录

时间:2014-12-26 07:49:57

标签: mysql

我有两个MySQL表

CREATE TABLE IF NOT EXISTS `orders` (
  `order_id` int(5) NOT NULL AUTO_INCREMENT,
  `order_address` varchar(255) NOT NULL,
  `order_paymentmethod` varchar(50) NOT NULL,
  `coupon_code` varchar(50) NOT NULL,
  `user_id` int(5) NOT NULL,
  PRIMARY KEY (`order_id`),
  KEY `fk_orderuser` (`user_id`),
  KEY `fk_ordercoupon` (`coupon_code`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `coupons` (
  `coupon_code` varchar(50) NOT NULL,
  `coupon_discount` int(255) NOT NULL,
  PRIMARY KEY (`coupon_code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

当从优惠券表中删除优惠券代码时,也删除优惠券相关的订单记录。我只想删除优惠券代码,而不会对表格订单产生任何影响

他们有什么解决方案吗?

此致

2 个答案:

答案 0 :(得分:1)

这里有三个选项

  1. 请勿删除优惠券,使用默认= deleted的其他布尔字段(例如true),但要删除它时将其设置为false(它实际上并没有删除它,但您可以使用此字段处理已删除的优惠券)。通过这种方式,您还可以跟踪使用优惠券启动的订单,该优惠券已被删除。

  2. coupon_code varchar(50) NOT NULL(在订单表中)中删除 not null 约束,并将外键约束添加到ON DELETE SET NULL。 *对于没有优惠券的订单,从一开始就将其设置为空。

  3. 使用已知的NULL模式。在您的数据库中创建一个虚拟优惠券(ZERO折扣),而不是删除优惠券,将此虚拟优惠券分配给不需要真正优惠券的订单。

  4. *取决于“跟踪”要求,可能需要结合上述方法

答案 1 :(得分:1)

在这种情况下,您可以使用mysql触发器解决该问题。为优惠券表创建触发器

CREATE TRIGGER `coupons_before_delete` AFTER DELETE ON `coupons` FOR EACH ROW BEGIN
--    INSERT INTO add_inout_to_error_log(msg) VALUES(old.coupon_code);
DELETE FROM orders WHERE orders.coupon_code = old.coupon_code;
END
此代码中的

old.coupon_code是当前已删除的优惠券代码。您可以访问已删除邮件

的任何字段