2014-12-26 107 views
0

时,我有两个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; 

当我从优惠券表中删除的优惠券代码的顺序记录了优惠券相关的太也将被删除。我只是想删除优惠券代码没有任何影响表订单

是他们的任何解决方案,请吗?

问候

+0

外键对于维护数据完整性至关重要。在插入数据之前,需要建立一个数据结构,并使其成为正确的。完成后 - 即创建所有主键和外键 - 完成工作! –

+0

创建表时,您需要指定InnoDB或另一个能够进行CASCADE操作的MySQL引擎。否则,将使用MySQL默认值MyISAM,并且MyISAM不支持CASCADE操作。 –

+0

您可以将您的外键约束更改为“ON DELETE SET NULL”,以便它不会删除相关订单 –

回答

1

这里有

  1. 不要删除优惠券,使用另一个布尔字段(例如deleted)三个选项默认= true,但是当你想将其设置为false删除它(它并不实际删除它,但您可以使用此字段处理已删除的优惠券)。通过这种方式,您还可以跟踪通过优惠券发起的订单,这些优惠券将被删除。

  2. 取下coupon_code varchar(50) NOT NULLNOT NULL约束(订单表)和外键约束添加到ON DELETE SET NULL。 *对于没有优惠券的订单,将它从头开始设置为空。

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

*取决于“跟踪”的要求,上述方法的组合可能需要

+0

非常感谢,3个选项对我很好 –

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是当前删除的优惠券代码。您可以访问任何字段删除项目