是否可以将Unique约束与Check约束相关联?

Ani*_*esh 1 t-sql sql-server check-constraints unique-constraint sql-server-2008

我有一个表access的架构如下:

create table access (
    access_id int primary key identity,
    access_name varchar(50) not null,
    access_time datetime2 not null default (getdate()),
    access_type varchar(20) check (access_type in ('OUTER_PARTY','INNER_PARTY')),
    access_message varchar(100) not null,
)
Run Code Online (Sandbox Code Playgroud)

仅允许访问类型OUTER_PARTY and INNER_PARTY.

我想要实现的是INNER_PARTY每次登录(用户)每天只能输入一次,但OUTER_PARTY可以记录任意次数.所以我想知道是否有可能直接这样做,或者是否存在创造这种限制的习语.

我已经检查了这个问题:结合UNIQUE和CHECK约束,但无法将它应用于我的情况,因为它的目标是另一回事.

Dam*_*ver 6

过滤唯一索引可以被添加到表中.此索引可以基于计算列,该access_time列从列中删除时间组件.

create table access (
    access_id int primary key identity,
    access_name varchar(50) not null,
    access_time datetime2 not null default (SYSDATETIME()),
    access_type varchar(20) check (access_type in ('OUTER_PARTY','INNER_PARTY')),
    access_message varchar(100) not null,
    access_date as CAST(access_time as date)
)
go
create unique index IX_access_singleinnerperday on access (access_date,access_name) where access_type='INNER_PARTY'
go
Run Code Online (Sandbox Code Playgroud)

似乎工作:

--these inserts are fine
insert into access (access_name,access_type,access_message)
select 'abc','inner_party','hello' union all
select 'def','outer_party','world'
go
--as are these
insert into access (access_name,access_type,access_message)
select 'abc','outer_party','hello' union all
select 'def','outer_party','world'
go
--but this one fails
insert into access (access_name,access_type,access_message)
select 'abc','inner_party','hello' union all
select 'def','inner_party','world'
go
Run Code Online (Sandbox Code Playgroud)