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

标签 mysql sql create-table check-constraints 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)
);

但我一直收到 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.



我在互联网上的其他任何地方都找不到对此错误的任何引用,我不明白问题是什么。
两者 column_acolumn_b也是其他表的外键,它们都可以为空。我只想确保 table 中的每一行通过 column_a 获得引用或通过 column_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.


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

关于mysql - 是否不可能有一个检查约束引用一个也有外键的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61361962/

相关文章:

mysql - 嵌套更新查询中出现错误

hadoop - 如何从 HIVE (sql) 中的列中删除文本

mysql - 复杂的 MySQL 选择

php - 触发错误

sql - HIVE SQL 将连续范围折叠成单行

SQL建表错误

MySQL从字符串创建表名

sql - 跨同一服务器上的两个 mysql 数据库查询的性能?

mysql - 从 MSSQL 迁移到 postgresql 或 mysql

sql - Polybase EXTERNAL TABLE 访问失败 - 权限被拒绝