我在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;
答案 0 :(得分:0)
外键不允许使用条件。
如果你想强迫这个条件,你必须通过编码来完成。
它可以在非数据库代码(Java,PHP,VB,...)中完成,或者您可以在MySQL中创建一个程序,该程序将被调用以执行插入,如果条件是,则将返回错误代码不匹配。
如果从各种代码/应用程序中插入,则该过程是可行的,因为它将被集中化。
答案 1 :(得分:0)
在UNIQUE KEY
和Employee
合并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”的行。
另一个解决方案是使用触发器,但我更喜欢查找表。