约束sql表上的表项
我有3个相关的表格,如下图所示 每个人在用户表中都有一个条目和一个UserRole。 有些用户是订户 我希望约束Subscribers表,以便它只能包含其角色IssusScriber的用户,但在用户级别保留UserRole。可能吗 请原谅当前表与表之间的关系,它们代表了当前的内容,而不是必要的内容 可能吗 理论上,是的;您可以使用SQL断言。有关示例,请参见约束sql表上的表项,sql,sql-server-2008,database-design,constraints,Sql,Sql Server 2008,Database Design,Constraints,我有3个相关的表格,如下图所示 每个人在用户表中都有一个条目和一个UserRole。 有些用户是订户 我希望约束Subscribers表,以便它只能包含其角色IssusScriber的用户,但在用户级别保留UserRole。可能吗 请原谅当前表与表之间的关系,它们代表了当前的内容,而不是必要的内容 可能吗 理论上,是的;您可以使用SQL断言。有关示例,请参见 然而,在实践中,没有主要的DBMS支持SQL断言,并且您所描述的不能实现为外键约束,因此我认为您唯一的选择是编写一个计算该约束的函数,如
然而,在实践中,没有主要的DBMS支持SQL断言,并且您所描述的不能实现为外键约束,因此我认为您唯一的选择是编写一个计算该约束的函数,如果它不满足,则引发一个异常。在表中没有RoleId的情况下,唯一的方法是通过触发器或(和触发器通常是一个糟糕的设计选择),或者是一个SQL代理作业,它周期性地从不符合条件的订阅服务器中删除人员 使用订阅服务器中的RoleID,可以添加一个检查约束,将其限制为特定值
如果采用不同的设计和/或在应用程序代码中执行,这将更好。我认为您可以删除
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)
您使用的是哪种数据库管理系统?Oracle?PostgreSQL?DB2?正是我所想的。:)谢谢ypercube,这就是我将使用的