数据库带条件多字段唯一问题

我建立一张表,包括a、b、c、d、e五个字段。a只能选择0和1,如果a=1,则要求b+C+D三个字段是唯一的,如果在DDL方面进行控制。

下面的代码亲测可用的了……

 IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestAsk]') AND type in (N'U'))
    DROP TABLE [dbo].[TestAsk]
GO
CREATE TABLE [dbo].[TestAsk](
    [id] int primary key identity(1,1), --主键
    [a] bit NOT NULL,
    [b] [varchar](50),
    [c] [varchar](50),
    [d] [varchar](50),
    [e] [varchar](50)
) ON [PRIMARY]
GO
-- =============================================
-- Author:      yenange
-- Create date: 2014-12-27
-- Description: a=1时,b,c,d必须唯一
-- =============================================
CREATE TRIGGER [dbo].[trig_TestAsk_I_U]
ON [dbo].[TestAsk]
FOR  INSERT, UPDATE
AS
BEGIN
    --如果插入(修改)的记录中存在:
    --1. a=1
    --2. 与原表相比:b,c,d相同, 但主键不同
    --则抛出错误信息
    IF EXISTS (SELECT 1 FROM [TestAsk] T1 where exists(
        select 1 from INSERTED T2 where T2.a=1 and T1.b=T2.b and T1.c=T2.c and T1.d=T2.d and T1.id!=T2.id
    ) )
    begin
        raiserror ('a=1时,b,c,d必须唯一!',16,1)
        rollback tran;
    end
END
go
--测试
--1. a=0时
insert into [TestAsk] (a,b,c,d) values(0,'b', 'c', 'd')
insert into [TestAsk] (a,b,c,d) values(0,'b', 'c', 'd')
insert into [TestAsk] (a,b,c,d) values(0,'b', 'c', 'e')
select *, 'a=0 insert后' as op from TestAsk
update TestAsk set d='d' where id=3
select *, 'a=0 update后' as op from TestAsk
--2. a=1
insert into [TestAsk] (a,b,c,d) values(1,'b', 'c', 'd')
go
update TestAsk set a=1 where id=3
go
select *, 'a=1 insert,update后' as op from TestAsk

用DDL,写个存储过程呗。

如果你这DDL是严格限制,那就不知道了,这种情况案例一般用触发器,不过DDL触发器应该实现不了行级的限制。