2010-04-18 65 views
0

如何在父級上設置空值時刪除子級行(刪除級聯?)?將父記錄設置爲空以便刪除子項:howto?

這是db設計。

表A [ID,b_id_1,b_id_2]

表B [ID,等領域...]

b_id_1和b_id_2可以是NULL

如果其中任何爲空,則裝置NO乙記錄對應FK(有它們中的2)

所以(b_id_1,b_id_2)可以是(NULL,NULL),(100,空),(NULL,100_or_any_other_number)等

如何在一個SQL查詢中將b_id_1(或b_id_2)設置爲null並刪除B中具有此ID的所有行?

什麼FK設計應該適用於2表?

查詢應該從表的角度來執行!

是的,如果我們使用「On delete set null」並從B表中刪除記錄,它將起作用。

但查詢必須只觸摸一個表!

然後你會發現,在mysql SQL語法中沒有像「從一行中刪除字段值」這樣的語句。

我們只能將它設置爲NULL。

這就是我需要的。

任何想法?

回答

1

ON DELETE SET NULL

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

[CONSTRAINT [symbol]] FOREIGN KEY 
    [index_name] (index_col_name, ...) 
    REFERENCES tbl_name (index_col_name,...) 
    [ON DELETE reference_option] 
    [ON UPDATE reference_option] 

reference_option: 
    RESTRICT | CASCADE | SET NULL | NO ACTION 

UPDATE:如果你想從一個表的角度這樣做(爲什麼地球上,你會希望這樣???),那麼你無法繞過觸發器,例如, G。

DELIMITER ;; 

CREATE TRIGGER tau_A AFTER UPDATE ON A 
FOR EACH ROW  
BEGIN 
    IF OLD.b_id_1 IS NOT NULL AND NEW.b_id_1 IS NULL; 
    THEN 
     DELETE FROM B WHERE id = OLD.b_id_1; 
    END IF; 
    IF OLD.b_id_2 IS NOT NULL AND NEW.b_id_2 IS NULL; 
    THEN 
     DELETE FROM B WHERE id = OLD.b_id_2; 
    END IF; 
END;; 

無論如何,這將不設置任何NULLA具有相同的價值,因爲你不能讓MySQL中的觸發器,改變觸發扳機同桌。一般來說,如果你想要這樣的奇怪東西,我可以很有可能斷言你的數據庫設計是有缺陷的。如果你提供更多的細節,我可以建議一個更好的細節。

+0

@codeholic我忘了添加一件重要的事情。查詢應該從表格的角度來執行!是的,如果我們使用這個On delete set null並從B表中刪除一條記錄,它將起作用。但查詢必須只觸摸一張桌子! – EugeneP 2010-04-18 08:05:11

+0

@EugeneP:我已經更新了我的答案。 – codeholic 2010-04-18 12:39:19

+0

謝謝,這不是一個簡單的問題,你的解決方案看起來很漂亮。 – EugeneP 2010-04-18 12:55:24

相關問題