create unique index unSn ON Test(YearStr,FullSn)// 两个字段组合起来做成唯一键
表 字段1,字段2
create unique index unSn1 ON Test(YearStr,FullSn) WHERE FullSn IS NOT NULL
//FullSn字段为Null不重复
第一种
以下为引用的内容:
CREATE TABLE test_tb
(
TestId int not null identity(1,1) primary key,
Caption nvarchar(100) null
);
GO
对于这个问题,大家的第一个想法可能是:在Caption这个字段上面加一个唯一键不就可以了吗?好,我们按着这个思路做下去,先创建唯一索引。
以下为引用的内容:
CREATE UNIQUE NONCLUSTERED INDEX un_test_tb
ON test_tb(Caption)
GO
第2种
1、新建表CREATE TABLE [dbo].[SnInFo](
[id] [INT] IDENTITY(1,1) NOT NULL,
[JobId] [INT] NULL,
[Mac] [VARCHAR](50) NULL,
[Mac1] [VARCHAR](50) NULL,
[QrCode] [VARCHAR](255) NULL,
[SnOui] [VARCHAR](50) NULL,
[LastLength] [INT] NULL,
[SnYearWeek] [VARCHAR](10) NULL,
[Seq] [INT] NULL,
[FullSn] [VARCHAR](50) NULL,--这个字段不能可空不能重复
[Create_Date] [DATETIME] NULL,
[Create_By] [VARCHAR](500) NULL,
[Use_Date] [DATETIME] NULL,
[Use_By] [VARCHAR](500) NULL)
FullSn这个字段不能可空不能有重复数据
2.增加自定义约束函数
create function [dbo].[FullSn_no_unique](@arg varchar(255))
returns bit
as
begin
declare @result bit
if((select COUNT(*) from dbo.SnInFo where FullSn is not null and FullSn=@arg)>1)
set @result = 0
else
set @result = 1
return @result
end
运行后会多一个函数
解释几个地方:
1.@arg 是函数的参数,数据类型要和该列一致。
2.if条件使用 >1,而不是 >0,如果是大于0的话,只能插入空值。我猜想约束的执行过程是:插入数据 > 验证数据是否符合约束 > 若不符合,则回滚。
4.增加约束
alter table SnInFo--表
add constraint Ring_No_FullSn_no_unique check (dbo.FullSn_no_unique(FullSn)=1)
约束函数名