我正在使用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注释的限制都是有用的。
答案 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并不真正支持物化视图,但您可以使用触发器和普通表手动创建它们。