Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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
Mysql在删除外键时删除所有记录_Mysql - Fatal编程技术网

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

Mysql在删除外键时删除所有记录,mysql,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,

我有两张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;
当我从优惠券表中删除优惠券代码时,优惠券相关的订单记录也会被删除。我只想删除优惠券代码,而不影响表格订单

请问他们有什么解决办法吗


关于

这里有三个选项

  • 不要删除优惠券,使用另一个布尔字段(例如
    deleted
    ),默认值=
    true
    ,但在您想要删除优惠券时将其设置为
    false
    (它实际上并没有删除优惠券,但您可以使用此字段处理删除的优惠券)。通过这种方式,您还可以跟踪在删除过程中使用优惠券发起的订单

  • 优惠券\u code varchar(50)not null
    (在订单表中)中删除not null约束,并在DELETE SET null上向
    添加外键约束*对于没有优惠券的订单,从一开始就将其设置为null

  • 使用称为空模式的模式。在数据库中创建虚拟优惠券(零折扣),并将此虚拟优惠券分配给不需要真实优惠券的订单,而不是删除优惠券


  • *根据“跟踪”要求,可能需要上述方法的组合

    在这种情况下,您可以使用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
    

    在此代码中,
    旧。优惠券代码
    是当前删除的优惠券代码。您可以访问已删除项的任何字段

    外键对于维护数据完整性至关重要。在插入数据之前,需要建立一个数据结构,并使其正确。完成后,所有主键和外键都被创建,工作就完成了!创建表时,需要指定InnoDB或其他能够进行级联操作的MySQL引擎。否则,将使用MySQL默认值MyISAM,并且MyISAM不支持级联操作。您可以将外键约束更改为删除集NULL时的
    ,这样它就不会删除相关的订单。那么,如果记录中没有优惠券\u代码,会发生什么?