2014-12-26 111 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是當前刪除的優惠券代碼。您可以訪問任何字段刪除項目