MySQL外键引用WHERE字段=值

时间:2014-03-16 22:14:22

标签: mysql

我在MySQL中创建了一个表(参见下面的代码)。正如您在代码中看到的,我有一个引用idNo的外键管理器。但是我只想参考那些有猫=' B'的员工。所以我需要像

这样的东西
FOREIGN KEY (manager ) REFERENCES Employee(idNo WHERE cat='B').

我是如何实现这一目标的。

idNo SMALLINT AUTO_INCREMENT UNIQUE, 
name VARCHAR(25) NOT NULL, 
telNo INT(11) NOT NULL, 
cat CHAR(1) NOT NULL, 
manager SMALLINT, 
PRIMARY KEY (idNo ),
FOREIGN KEY (manager ) REFERENCES Employee(idNo) on DELETE CASCADE)ENGINE=INNODB   
AUTO_INCREMENT=1000;

2 个答案:

答案 0 :(得分:0)

外键不允许使用条件。

如果你想强迫这个条件,你必须通过编码来完成。

它可以在非数据库代码(Java,PHP,VB,...)中完成,或者您可以在MySQL中创建一个程序,该程序将被调用以执行插入,如果条件是,则将返回错误代码不匹配。

如果从各种代码/应用程序中插入,则该过程是可行的,因为它将被集中化。

答案 1 :(得分:0)

UNIQUE KEYEmployee合并idNo中创建新的cat

ALTER TABLE Employee ADD UNIQUE KEY (idNo,cat);

在子表中创建一个引用该新唯一键的外键。

ALTER TABLE SomeTable ADD FOREIGN KEY (idNo,cat) REFERENCES Employee(idNo,cat);

然后,您只需要确保cat被约束为子表中的单个值“B”。一种解决方案是创建一个只包含单个值“B”的查找表。

CREATE TABLE JustB (cat char(1) PRIMARY KEY);
ALTER TABLE SomeTable ADD FOREIGN KEY(cat) REFERENCES JustB(cat);

现在,您可以在子表中使用的唯一值是“B”,因此它自然只能引用Employee中具有cat“B”的行。

另一个解决方案是使用触发器,但我更喜欢查找表。