2011-09-23 83 views
3

在MySQL中,有没有一种方法可以指定a.column不能存在于b.column - 反向外键?有没有这种东西作为一个逆向外键?

换句话说:

# Would not return any rows ever 
SELECT * FROM a 
INNER JOIN b ON a.column = b.column; 

# Would fail 
INSERT INTO a 
SELECT * FROM b; 

# Would not insert any rows 
INSERT IGNORE INTO a 
SELECT * FROM b; 
+0

你想“可以在A或B,但不是两个”? – gbn

+0

@gbn这是正确的。 – Aistina

回答

0

尝试创建一个触发器,并从它抛出一个错误。

3

不,没有这样的事情。

你需要做的是,在触发:

DELIMITER $$ 

CREATE TRIGGER bi_a_each BEFORE INSERT ON a FOR EACH ROW 
BEGIN 
    DECLARE forbidden_key INTEGER; 
    SELECT id INTO forbidden_key FROM b WHERE b.id = NEW.acolumn LIMIT 1; 
    IF forbidden_key IS NOT NULL THEN 
    SELECT * FROM error_insertion_of_this_value_is_not_allowed; 
    END IF; 
END $$ 

DELIMITER ; 
2

一定程度上,如果你想“可以在A或B,但不能同时”

这是“超级键/子类型”图案

创建一个新的表AB具有2列

  • SomeUniqueValue,PK
  • WhichChild炭(1),限定于 'A' 或 'B'

还有一个唯一约束上两列

然后

  • 添加WhichChild列表阿和B.在A中,它总是'a'。从A到AB和B AB在B,总是 'B'
  • 添加上

现在外键,SomeUniqueValue可以在仅A或B.

注意:正确的RDBMS您可以使用检查约束或计算列来根据需要将WhichChild限制为“a”或“b”。但是MySQL是有限的,所以你需要在MySQL中使用触发器。然而,这是简单的测试表B每个插入A等

+0

非常有趣的方法!我假设你必须使用ON INSERT触发器将A或B的值放入AB中? – Aistina

+0

或存储过程... – gbn

+0

+1,非常好的方法。 – Johan

相关问题