SQL Server 2008 某字段(或字段中某些内容)不能重复增加

gzlx 2014-12-27 01:03:34
一、表中有两字段
name type
张三 1
张三 4
张三 -1

如果增加:
张三 3
就不成功,即当(type=0 or type = 1 or type = 3)时不能重复增加?
二、编码字段
billno
BM0001-20141211
BM0002-20141212
要求substring(billno,3,4)不能重复,即不能增加BM0001-20141212

以上如何增加check约束实现
...全文
688 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2014-12-27
  • 打赏
  • 举报
回复
问题1,用触发器实现.

create table gz1(name varchar(10),type int)

insert into gz1(name,type)
 select '张三',1 union all
 select '张三',4 union all
 select '张三',-1


-- 创建触发器
create trigger tr_gz1 on gz1
for insert
as
begin
 if exists(select 1
           from gz1 a
           inner join inserted b on a.name=b.name
           where a.type in(0,1,3))
    and exists(select 1 
               from inserted
               where type in(0,1,3))
 begin
   raiserror(N'当(type=0 or type = 1 or type = 3)时不能重复增加.',16,1)
   rollback tran
 end 
end


-- 测试1
insert into gz1(name,type) select '张三',3
/*
Msg 50000, Level 16, State 1, Procedure tr_gz1, Line 14
当(type=0 or type = 1 or type = 3)时不能重复增加.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/

-- 测试2
insert into gz1(name,type) select '张三',5
/*
(1 row(s) affected)
*/

-- 测试3
insert into gz1(name,type) select '张三',0
/*
Msg 50000, Level 16, State 1, Procedure tr_gz1, Line 14
当(type=0 or type = 1 or type = 3)时不能重复增加.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/

-- 结果
select * from gz1
/*
name       type
---------- -----------
张三         1
张三         4
张三         -1
张三         5

(4 row(s) affected)
*/
中国风 2014-12-27
  • 打赏
  • 举报
回复
或新增一个计算用于检查这样性能高一些
USE tempdb
go

CREATE TABLE TAB(billno VARCHAR(50) )
go
ALTER TABLE TAB ADD CHK_billno AS SUBSTRING(billno,3,4) UNIQUE
go
GO
INSERT INTO TAB(billno) VALUES('BM0001-20141211')
INSERT INTO TAB(billno) VALUES('BM0001-20141211')

DROP TABLE TAB
中国风 2014-12-27
  • 打赏
  • 举报
回复
可用触发器实现方法
USE tempdb
go

CREATE TABLE TAB(billno VARCHAR(50) )
go
go
CREATE TRIGGER tr_cTAB ON TAB
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS(SELECT 1 FROM INSERTED AS i WHERE EXISTS(SELECT 1 FROM TAB WHERE SUBSTRING(billno,3,4)=SUBSTRING(i.billno,3,4)))
BEGIN
RAISERROR (N'bill重复',16,1)
RETURN
END
INSERT INTO TAB SELECT billno FROM INSERTED
END

GO
INSERT INTO TAB(billno) VALUES('BM0001-20141211')--OK
INSERT INTO TAB(billno) VALUES('BM0001-20141211')--Error

DROP TABLE TAB

  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
使用check约束。 http://www.cnblogs.com/kissdodog/archive/2013/05/31/3109509.html
执行check之前,原表中确定没有数据。

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧