是否有反向外键这样的东西?

时间:2011-09-23 10:27:04

标签: mysql foreign-keys theory

在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;

3 个答案:

答案 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 ;

答案 1 :(得分:2)

在某种程度上,如果你想“可以在A或B中,但不能同时在两者中”

这是“超级键/子类型”模式

创建一个包含2列的新表AB

  • SomeUniqueValue,PK
  • WhichChild char(1),限于'a'或'b'

两列都有唯一约束

然后

  • 将WhereChild列添加到表A和B.在A中,它始终为“a”。在B中,总是'b'
  • 两个
  • 上将外键从A添加到AB,B添加到AB

现在,SomeUniqueValue只能在A或B中。

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

答案 2 :(得分:0)

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