2012-04-13 49 views
0

我與預設值的「查找」表(獲悉它比ENUM)MySQL刪除引用嗎?

CREATE TABLE tbl_payment_type (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    description VARCHAR(25) 
); 
INSERT INTO tbl_payment_type 
    (description) 
VALUES 
    ('PAYPAL'), 
    ('DEBIT CARD'), 
    ('CREDIT CARD'), 
    ('CASH ON DELIVERY'); 

現在,我的每一個訂單包含支付類型。

CREATE TABLE tbl_order (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    ... 
    payment_type INT, 
    FOREIGN KEY(payment_type) REFERENCES tbl_payment_type(id) 
) AUTO_INCREMENT = 1000; 

我目前使用MyISAM,但可能會在未來嘗試InnoDB(我不確定是否會影響問題)。

最後,問題是,如果我嘗試刪除tbl_payment_type中的記錄,是否會導致MySQL自動刪除包含此付款類型的所有記錄tbl_order

回答

3

MyISAM不支持外鍵,因此在使用此存儲提供程序時沒有任何反應。

InnoDB支持外鍵,默認情況下它會限制沒有外國匹配刪除和更新。通過添加ON DELETE和ON UPDATE選項可以更改此行爲。請參閱MySQL網站上的FOREIGN KEY Constraints

+0

好的感謝的的payment_type進入它會給你一個錯誤。那麼我想我會堅持使用MyISAM。 – Ozzy 2012-04-13 10:26:53

+0

如果您使用忽略它們的引擎,那麼關於外鍵的問題有什麼意義? :) – 2012-04-13 10:29:56

+0

@ N.B。嗯,當我在紙上設計數據庫時,自然我創建了一個關係數據庫。當我將其轉換爲MySQL時,我沒有意識到FK默認不受支持。在開始使用InnoDB之前,我還有更多要學習。至少在這些留下來的時候,如果我將來需要改變,將會很快改變。另外,在查看SQL源代碼時,它可以幫助您瞭解留下的FK約束條件。 – Ozzy 2012-04-13 10:32:03

1

如果試圖從DELETEtbl_payment_type

delete from `test`.`tbl_payment_type` where `id`='2' 

Error:1451 Cannot delete or update a parent row: a foreign key constraint fails (test . tbl_order , CONSTRAINT tbl_order_ibfk_1 FOREIGN KEY (payment_type) REFERENCES tbl_payment_type (id))

+0

@MalheshPatil這隻適用於InnoDB,對不對?如果你使用InnoDB,你能告訴我們如何用FK正確地刪除記錄嗎? – Ozzy 2012-04-13 10:28:23

+0

BTW:這適用於只是InnoDB的類型櫃面的MyISAM的沒有關係,因此沒有對另一個表 – 2012-04-13 10:28:55

+0

首先,你必須刪除所有條目WRT''從tbl_order' payment_type'那麼只有你可以刪除的條目上刪除無影響'tbl_payment_type' 例如:如果你想刪除''Paypal'from條目tbl_payment_type'你應該從'tbl_order'具有刪除所有條目'id' = 1那麼只有你可以刪除'tbl_payment_type'條目其中有'id' = 1(Paypal) – 2012-04-13 10:34:07