Sql Server 自定义约束 实现:某列 可空,但非空值唯一不重复

 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)

                                                                                                           约束函数名

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值