是否不可能让检查约束引用也有外键的列?
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_a
和 column_b
也是其他表的外键,它们都可以为空。我只想确保 table
中的每一行都通过 column_a
或 column_b
.
进行引用
这个错误的原因是什么?
我尝试了什么
我尝试删除外键,添加检查约束并成功。然后,如果我将外键添加回 column_b
,我仍然会遇到同样的错误。
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.
因此您需要在对列执行引用操作或检查约束之间做出选择。或者,您可以保留引用操作并使用触发器实现检查逻辑(或者保留检查约束并在触发器中实现引用操作!)。
我在 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_a
和 column_b
也是其他表的外键,它们都可以为空。我只想确保 table
中的每一行都通过 column_a
或 column_b
.
这个错误的原因是什么?
我尝试了什么
我尝试删除外键,添加检查约束并成功。然后,如果我将外键添加回 column_b
,我仍然会遇到同样的错误。
Foreign key referential actions (
ON UPDATE
,ON DELETE
) are prohibited on columns used inCHECK
constraints. Likewise,CHECK
constraints are prohibited on columns used in foreign key referential actions.
因此您需要在对列执行引用操作或检查约束之间做出选择。或者,您可以保留引用操作并使用触发器实现检查逻辑(或者保留检查约束并在触发器中实现引用操作!)。