【问题标题】:How to add a SQL constraint for values in multiples tables如何为多个表中的值添加 SQL 约束
【发布时间】:2017-10-22 20:54:52
【问题描述】:

我正在使用 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 应该存在于PermissionRule 表中。

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

我在 Hibernate 中使用 Spring Data。所以任何基于 spring 或 hibernate 注释的限制也是有用的。

【问题讨论】:

  • 主键/外键约束将部分获得您想要的行为。你能从应用层处理这个逻辑吗?
  • 我绝对可以在应用层做到这一点。但是想知道我们是否可以通过 SQL 做任何事情。特别是,当我在 PermissionRule 中删除一行时,我可能会喜欢从 UserPermission 中删除适用的条目。我想我可能必须为这种情况编写程序或触发器......

标签: mysql sql spring hibernate spring-data


【解决方案1】:

如果是 Oracle,答案将是使用“Check Constraints”。

MySQL doesn't support 检查约束。

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

【讨论】:

    【解决方案2】:

    根据您希望约束的行为方式,您可能可以在物化视图的帮助下使用外键约束来实现。

    我现在假设,你想要的是: (UserTypeID, AccountTypeID, PermissionID) 的 3 元组应该出现在 PermissionRule 表中。所有字段都出现在 UserPermission

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多