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

Sho*_*nte 5 mysql sql check-constraints create-table mysql-8.0

我在 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)
);
Run Code Online (Sandbox Code Playgroud)

但我不断收到此错误

列“column_b”不能用于检查约束“table_chk_1”:需要在外键约束“table_ibfk_2”引用操作中使用。

我在互联网上的其他任何地方都找不到对此错误的任何参考,我不明白问题是什么。无论column_acolumn_b也的外键与其它表,他们都是空。我只想确保中的每一行table都有一个引用 viacolumn_a或 via column_b

这个错误的原因是什么?


我试过什么

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

GMB*_*GMB 8

这是有记录的行为

禁止对约束中使用的列执行外键引用操作(ON UPDATE、 ) 。同样,禁止对外键引用操作中使用的列进行约束。ON DELETECHECKCHECK

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

  • 哦,是的,显然这是由“column_b”的“ON UPDATE CASCADE”引起的。嗯,我不确定我是否理解这种行为背后的基本原理?也许您有什么见解? (2认同)