MySQL foreign key 問題

edited 十月 2013 in 資料庫
現在有3個表,
table a (a_id)
table b (b_id)
table a_has_b (a_id, b_id)
一個a 可以連接 多個b
一個b 最少要連接一個 a

table a 有兩項資料 (1) , (2)
table b 有一項資料 (1)
table a_has_b 有兩項資料 (1, 2), (2,1)

我在 a_has_b 加了 foreign key,
FOREIGN KEY (`a_id`) REFERENCES `a` (`a_id`) ON DELETE CASCADE ON UPDATE CASCADE
FOREIGN KEY (`b_id`) REFERENCES `b` (`b_id`) ON DELETE CASCADE ON UPDATE CASCADE

如果我而在del table a 第一項, 然後第二項,
table a 變成空
table a_has_b 變成空
但table b 仍然有一項資料

我想問怎樣可以將那項自動del ?


原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=4836

評論

  • edited 一月 2010
    你好
    首先,你的逻辑有些问题,比如
    table a 是经理表
    table b 是员工表
    table a_has_b 是经理员工表

    1.如果经理离职,那么 删除 a表经理1,经理2 table a ->del 1, 2

    2.造成经理人员下属重组 ,经理员工表自然消失信息 a_has_b

    3.但是,,table b 表并没有受到影响,员工不会因为经理离职而被辞退

    以上是我的一些小见解,欢迎来讨论.
  • edited 一月 2010
    可以選擇透過程式處理,或者是 MySQL TRIGGER
    DELIMITER $$
    DROP TRIGGER empty_check$$
    CREATE TRIGGER empty_check AFTER DELETE ON a_has_b
    FOR EACH ROW
    BEGIN
    DECLARE counter INTEGER;
    SELECT COUNT(*) INTO counter FROM a_has_b WHERE b_id = OLD.b_id;
    IF(counter = 0) THEN
    DELETE FROM b WHERE b.id = OLD.b_id;
    END IF;
    END$$
    DELIMITER ;
    
  • edited 一月 2010
    takego 寫道:
    你好
    首先,你的逻辑有些问题,比如
    table a 是经理表
    table b 是员工表
    table a_has_b 是经理员工表

    1.如果经理离职,那么 删除 a表经理1,经理2 table a ->del 1, 2

    2.造成经理人员下属重组 ,经理员工表自然消失信息 a_has_b

    3.但是,,table b 表并没有受到影响,员工不会因为经理离职而被辞退

    以上是我的一些小见解,欢迎来讨论.

    多謝你的回覆, 你的例子其實和我說明的有所不同
    因為table a 和 table b 的連接必定要 1-n , 不是 0-n
  • edited 一月 2010
    kiang 寫道:
    可以選擇透過程式處理,或者是 MySQL TRIGGER
    DELIMITER $$
    DROP TRIGGER empty_check$$
    CREATE TRIGGER empty_check AFTER DELETE ON a_has_b
    FOR EACH ROW
    BEGIN
    DECLARE counter INTEGER;
    SELECT COUNT(*) INTO counter FROM a_has_b WHERE b_id = OLD.b_id;
    IF(counter = 0) THEN
    DELETE FROM b WHERE b.id = OLD.b_id;
    END IF;
    END$$
    DELIMITER ;
    

    多謝你的回覆!! TRIGGER 真的是好好的方法,
    不過好像要MySQL 5.1 才支援吧...?
    最後我還是用了在php 中進行Del
Sign In or Register to comment.