SQL规则取决于选定的值

时间:2015-02-05 15:20:38

标签: sql sql-server sql-server-2008

我有以下简单的数据库:

Table Types:
- ID int
- TypeName nvarchar

Table Users:
- ID int
- UserName nvarchar
- TypeID int

Table BusyTime
- ID int
- UserID int
- BTime time(0)

但是一个限制 - BusyTime中的记录应仅适用于TypeID = 3的用户.TypeID = 1且TypeID = 2的用户在BusyTime中不能有记录(它与业务逻辑相矛盾) 如何在MS SQL级别上描述它?或者我应该重新设计数据库?

3 个答案:

答案 0 :(得分:2)

我假设每张桌子中的主键都在ID上。您需要更改的是,在UNIQUE KEY中的 IDTypeID上添加Users约束:

ALTER TABLE Users ADD CONSTRAINT UQ_User_Types_XRef (ID,TypeID)

并将BusyTime表创建为:

CREATE TABLE BusyTime (
   ID int not null,
   UserID int not null,
   BTime time(0) not null,
   _Type_XRef as 3 persisted,
   constraint PK_BusyTime PRIMARY KEY (ID),
   constraint FK_BusyTime_Users FOREIGN KEY (UserID)
        references Users (ID),
   constraint FK_BusyTime_Users_XRef FOREIGN KEY (UserID,_Type_XRef) 
        references Users (ID,TypeID)
)

我认为PK_BusyTimeFK_BusyTime_Users是您现有的约束。现在FK_BusyTime_Users存在FK_BusyTime_Users_XRef(这是"真正的"外键约束),这是一个品味问题。

答案 1 :(得分:0)

您可以使用检查约束来禁止无效类型: https://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx

答案 2 :(得分:0)

可以设置这样的条件约束。一种方法是将复合索引添加到users

create unique index idx_users(type, id) on users(type, id)

然后将其用于外键约束:

alter table busytime add _type as (3) persisted not null;
alter table busytime add constraint foreign key (_type, userId) on users(type, id);

不幸的是,我认为此列需要persisted,因此它实际占用了记录中的空间。

不幸的是,我认为这不起作用:

alter table busytime add constraint foreign key (3, userId) on users(type, id);