如何为多个表中的值添加SQL约束

时间:2017-05-23 04:19:22

标签: mysql sql spring hibernate spring-data

我正在使用MySQL。

我有以下表格

User(UserID, UserTypeID, AccountID)
Account(AccountID, AccountTypeID)
Permission(PermissionID)
UserType(UserTypeID)
AccountType(AccountTypeID)
UserPermission(UserID, PermissionID)
PermissionRule(UserTypeID, AccountTypeID, PermissionID)

是否可以使用SQL约束限制以下内容? 将权限插入UserPermission表后,该用户的UserTypeID,该用户的帐户中的AccountTypeID和正在插入的PermissionID应该出现在{ {1}}表。

对于业务规则或过程/触发器,这样的感觉可能更多,但想知道是否有任何方法可以限制使用我不知道的SQL约束。

我正在使用Spring Data with Hibernate。因此,任何基于Spring或hibernate注释的限制都是有用的。

2 个答案:

答案 0 :(得分:2)

如果是Oracle,那么答案就是使用“Check Constraints”。

MySQL doesn't support检查约束。

  

CHECK子句被解析但被所有存储引擎忽略。请参见第1.8.2.3节“外键差异”。

答案 1 :(得分:0)

根据您希望约束的行为方式,您可以使用外键约束,在物化视图的帮助下完成此操作。

我现在假设,你想要的是:UserTypeID, AccountTypeID, PermissionID)表格中存在(PermissionRule的3元组。所有字段都出现在UserPermission < / p>

如果3元组在PermissionRule中是唯一的,则可以创建外键约束。如果没有,您可以基于SELECT DISTINCT UserTypeID, AccountTypeID, PermissionID FROM PermissionRule创建实体化视图,并从唯一约束中引用该表。

如果要约束的3个字段不在UserPermission中,但必须从其他表中查找,则可以创建物化视图以执行必要的连接并将外键放在其上。

MySQL并不真正支持物化视图,但您可以使用触发器和普通表手动创建它们。

如本文所述:http://www.fromdual.com/mysql-materialized-views