我有3个相关的表,如下图所示。在sql表上约束表条目
每个人都有在用户表和UserRole的条目。 某些用户是订户。
我想约束Subscribers表,以便它只能包含角色为IsSusbcriber但保留UserRole在用户级别的用户。可能吗?
请原谅目前表格之间的关系,它们代表目前的情况,而不是必要的。
我有3个相关的表,如下图所示。在sql表上约束表条目
每个人都有在用户表和UserRole的条目。 某些用户是订户。
我想约束Subscribers表,以便它只能包含角色为IsSusbcriber但保留UserRole在用户级别的用户。可能吗?
请原谅目前表格之间的关系,它们代表目前的情况,而不是必要的。
我想你可以放下IsSubscriber
列,并添加一个UserSubscriberRoles
表将仅包含那些先前设定的IsSubscriber
列的角色。
CREATE UserSubscriberRoles
(UserRoleId PRIMARY KEY
, FOREIGN KEY (UserRoleId)
REFERENCES UserRoles (UserRoleId)
) ;
然后在Subscribers
表改变FKS到:
FOREIGN KEY (UserId, UserRoleId)
REFERENCES User (UserId, UserRoleId)
FOREIGN KEY (UserRoleId)
REFERENCES UserSubscriberRoles (UserRoleId)
正是我在想什么。 :) – Diego 2012-08-08 18:18:51
谢谢ypercube,这是我会一起去的 – dotnetnoob 2012-08-09 06:36:56
这可能吗?
理论上,是的;你可以使用SQL断言。例如,请参阅this StackOverflow answer。
然而,在实践中,没有主要的DBMS支持SQL断言,并且您描述的内容不能作为外键约束实现,所以我认为您唯一的选择是编写一个trigger来评估此约束,并引发异常如果不满意。
在表中没有RoleId的唯一方法是通过触发器(并且触发器通常是一个糟糕的设计选项),或者是定期从订阅者中删除不符合条件的人员的SQL代理作业。
使用RoleID在Subscribers中,可以添加一个检查约束,将其限制为特定值。
这会更好地执行不同的设计和/或在应用程序代码。
哪些DBMS您使用的?甲骨文? PostgreSQL的? DB2? – 2012-08-08 17:51:37
miscrosoft sql server 2008 – dotnetnoob 2012-08-09 06:22:30