mysql - 如何为外键添加约束,使其依赖于表 FK 来自的列的值?

标签 mysql database constraints

我需要设置约束,以便只有当该表中的另一列具有特定值时,该表才接受来自其他表的外键。

数据库很复杂,但让我举个例子:

表富:

Foo_id | Foo_value | Another values...
   1   |  "GOOD"   |
   2   |  "BAD"    |
   3   |  "GOOD"   |

表格栏:

Bar_id | Foo_id(FK) | Another values...
   1   |     1      |
   2   |     1      |
   3   |     3      |

如您所见,Bar 应该只接受 Foo_Value 为“GOOD”的 Foo 的 accept id。

我尝试添加检查约束,但它不接受 WHERE 语句,所以我无法访问 Foo_Value。我尝试搜索,但我真的找不到任何东西,或者我对此的解释是错误的。

最佳答案

可能唯一的方法是使用trigger(用于插入/更新):

create trigger chk_bar before insert on bar  /* before update */
for each row 
begin  
   if  not exists (SELECT 1 FROM foo 
                  WHERE Foo_value = 'GOOD' AND foo_id = new.foo_id)  then
       SIGNAL SQLSTATE '45000'   
       SET MESSAGE_TEXT = 'Invalid FK';
   end if; 
end; 

Rextester Demo

请记住在更新 GOOD -> BAD 时在 foo 上添加另一个触发器,或者删除将检查引用完整性的触发器。

关于mysql - 如何为外键添加约束,使其依赖于表 FK 来自的列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47165123/

相关文章:

java - Mysql数据导出工具

c# - 通过 C# 将 WPF 表单中的数据插入 MySQL 数据库

php - 连接同一服务器上的两个相似数据库

mysql - T-Sql,在列中拆分字符串并插入表中

mysql - 改变表a中的值也会改变表b中的值

php - 如何在div中保留增加的内容

mysql - 加入有条件的特定列

mysql - 像 "User_type table"这样的 TYPE 表的用途是什么?

sql - MSSQL : Update statement avoiding the CHECK constraint

SQL ALTER TABLE 删除级联