Wlt*_*Rpo 17 sql sql-server constraints sql-server-2008
我有一个表,我需要限制插入的数据,我已经使用了一个触发器,但我想知道我是否可以使用约束执行相同的任务.
这些领域是:
Id
Date
Passport
...
Deleted
Run Code Online (Sandbox Code Playgroud)
当Deleted字段为1时,约束必须允许n条记录,但如果Deleted字段为0,则必须只有一条具有相同Date和Passport的行.
应该为这个步骤工作:
直到第五步,一切正常,但在最后一步必须有一个错误,那是因为我无法处理具有相同Date,同一Passport和Deleted = 0的两行
提前致谢.
Gor*_*off 25
您可以使用过滤的唯一索引:
create table [t](
[id] [int] NULL,
[date] [datetime] NULL,
[passport] [char](8) NULL,
[deleted] [int] NULL
)
create unique index unq_t_date_passport on t(date, passport)
where deleted = 0;
Run Code Online (Sandbox Code Playgroud)
编辑:
如果筛选的索引不适用于您的SQL Server版本,则可能需要检查兼容级别.只要兼容性设置为100或更高,它就应该可用.您可以使用以下方法检查服务器版本和兼容级别:
SELECT SERVERPROPERTY('ProductVersion');
SELECT name, compatibility_level FROM sys.databases;
Run Code Online (Sandbox Code Playgroud)
假设id是唯一且非负的,还有另一种方法可以在SQL Server 2005中启动.它使用计算列与过滤后的索引基本相同:
alter table t
add column deleted_id (case when deleted = 0 then -1 else id end) persisted;
create unique index unq_t_passport_date_deleted_id on t(passport, date, deleted_id);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |