是否不可能让检查约束引用也有外键的列?

Is it not possible to have a check constraint reference a column that also has a foreign key?

我在 MySQL 8 尝试添加检查约束:

ALTER TABLE `table` ADD CHECK (
    (`column_a` IS NULL AND `column_b` IS NOT NULL) OR
    (`column_a` IS NOT NULL AND `column_b` IS NULL)
);

但我一直收到 this error:

Column 'column_b' cannot be used in a check constraint 'table_chk_1': needed in a foreign key constraint 'table_ibfk_2' referential action.

我在 Internet 上的其他任何地方都找不到关于此错误的任何参考,而且我不明白问题出在哪里。 column_acolumn_b 也是其他表的外键,它们都可以为空。我只想确保 table 中的每一行都通过 column_acolumn_b.

进行引用

这个错误的原因是什么?


我尝试了什么

我尝试删除外键,添加检查约束并成功。然后,如果我将外键添加回 column_b,我仍然会遇到同样的错误。

这是a documented behavior:

Foreign key referential actions (ON UPDATE, ON DELETE) are prohibited on columns used in CHECK constraints. Likewise, CHECK constraints are prohibited on columns used in foreign key referential actions.

因此您需要在对列执行引用操作或检查约束之间做出选择。或者,您可以保留引用操作并使用触发器实现检查逻辑(或者保留检查约束并在触发器中实现引用操作!)。