sqlserver check约束 从基础到高级应用 总结

news/2025/2/26 19:54:34

 

1. 规定某 字段的数据必须是字母或者数字或者字母

alter table 表名 add constraint 约束名 check(字段 like '%[0-9][a-z]%')

上边是必须有字母和数字的,你可以加个:
or 字段 like '%[0-9]%'
or 字段 like '%[a-z]%'

2. 时间约束 EndTime不能早于BeginTime

EndTime>BeginTime or EndTime=BeginTime

 

3.Int型字段,值减一且 int字段不小于0

  update table1 set a=a-1 
   并增加check约束
   check (a<>0)

4. 一列是CHECK约束:手动或自动;
    一列是Check约束:大于等于0

alter table 表名 add constraint [约束名1] check(字段名1 in ('手动','自动'))
alter table 表名 add constraint [约束名2] check(字段名2〉=0 or check(字段名2〉>0)

5.一个年龄字段设check约束:
alter table stu add constraint CK_stu_age check(age between 15 and 50)

 

6. check 某字段的长度

create proc pro_check_lengh
(
@in_no varchar(20),

@out_rtn smallint output

)
as
  declare @len int
  set @len=len(@in_no)
  if @len='指定的长度'

  begin
    set out_rtn =0
  end
  else
  begin
    set out_rtn =1
  end

 

7.删除SQL约束

1)禁止所有表约束的SQL
select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'

2)删除所有表数据的SQL
select 'TRUNCATE TABLE '+name from sysobjects where type='U'

3)恢复所有表约束的SQL
select 'alter table '+name+' check constraint all' from sysobjects where type='U'

4)删除某字段的约束
declare @name varchar(100)
--DF为约束名称前缀
select @name=b.name from syscolumns a,sysobjects b where a.id=object_id('表名') and b.id=a.cdefault and a.name='字段名' and b.name like 'DF%'
--删除约束
alter table 表名 drop constraint @name
--为字段添加新默认值和约束
ALTER TABLE 表名 ADD CONSTRAINT @name  DEFAULT (0) FOR [字段名]对字段约束进行更改
--删除约束
ALTER TABLE tablename
Drop CONSTRAINT 约束名
--修改表中已经存在的列的属性(不包括约束,但可以为主键或递增或唯一)
ALTER TABLE tablename
alter column 列名 int not null
--添加列的约束
ALTER TABLE tablename
ADD CONSTRAINT DF_tablename_列名 DEFAULT(0) FOR 列名
--添加范围约束
alter table  tablename  add  check(性别 in ('M','F'))

 

8. 一个邮编的约束: 5位数字

ALTER TABLE dbo.ZIPCodes ADD CONSTRAINT CK_ZIPCodes_ZIPCode CHECK (ZIPCode like '[0-9] [0-9] [0-9] [0-9] [0-9]')

 

9.日期范围约束(动态SQL形式)

alter table '+@char1+' with nocheck add constraint '+@manage_flg1+@key1+@key2+@key3+@key4+@key5+@char9+' check ('+@char3+' >=''1900/01/01'' and '+@char3+' <=''2101/01/01'')'

10.指定区分约束

 商品种类区分
 alter table m_item with nocheck add constraint pdm101600B check(item_flg in('0','1','2','3'))

   商品重要区分
 alter table m_item with nocheck add constraint pdm1011200B check((imp_flg in('0','1')) or (item_flg in ('2','3') and imp_flg ='1'))

11.限定别的表的关联约束(约束+函数)

--约束1: 元図1和元図2要和品目表的商品コード1和商品コード2 存在并且商品区分=机种
 --元図1
 alter table m_item with nocheck add constraint pdm101900C check(past_draw_cd1 = (dbo.FN_PDM_CHECK_M_ITEM(past_draw_cd1,past_draw_cd2,item_flg,'1','1')))
 --元図2
 alter table m_item with nocheck add constraint pdm1011000C check(past_draw_cd2 = (dbo.FN_PDM_CHECK_M_ITEM(past_draw_cd1,past_draw_cd2,item_flg,'2','1')))

--约束2: --関連図番_工番和関連図番_番号要:  制番区分<>3,4的  品目表的商品コード1和商品コード2 存在并且商品区分=部品

 --関連図番_工番
 alter table t_part_cons_history with nocheck add constraint pdm1021400C check(
 (prc_kbn in('3','4') AND rel_draw_cd1 = (dbo.FN_PDM_CHECK_M_ITEM(rel_draw_cd1,rel_draw_cd2,'','1','2'))) or prc_kbn not in('3','4'))
 --関連図番_番号
 alter table t_part_cons_history with nocheck add constraint pdm1021500C check(
 (prc_kbn in('3','4') AND rel_draw_cd2 = (dbo.FN_PDM_CHECK_M_ITEM(rel_draw_cd1,rel_draw_cd2,'','2
 ','2'))) or prc_kbn not in('3','4'))

CREATE  FUNCTION [dbo].[FN_PDM_CHECK_M_ITEM]
(
 @IN_ITEM_CD1 NVARCHAR(5),   --品目コード1
 @IN_ITEM_CD2 NVARCHAR(10),  --品目コード2
 @IN_ITEM_FLG NVARCHAR(1),   --品目区分
 @TYPE_FLG   NVARCHAR(1),    --チェック区分(1:品目コード1をチェック、1以外:品目コード2をチェック)
   @SERVICE_KUBUN   NVARCHAR(1) --品目区分制御(1:品目区分=1.2.3,1以外:指定の品目区分により)
)
RETURNS NVARCHAR(20)
AS
BEGIN
    DECLARE @OUT_RTN NVARCHAR(20)=''
    --
    IF @SERVICE_KUBUN = '1'
    BEGIN
    
     IF @TYPE_FLG='1'
     BEGIN
      SELECT @OUT_RTN=ITEM_CD1 FROM M_ITEM
      WHERE ITEM_CD1=@IN_ITEM_CD1 AND ITEM_CD2=@IN_ITEM_CD2 AND ITEM_FLG = @IN_ITEM_FLG
     END
     ELSE
     BEGIN
      SELECT @OUT_RTN=ITEM_CD2 FROM M_ITEM
      WHERE ITEM_CD1=@IN_ITEM_CD1 AND ITEM_CD2=@IN_ITEM_CD2 AND ITEM_FLG = @IN_ITEM_FLG
     END
 END
 ELSE
 BEGIN
     IF @TYPE_FLG='1'
     BEGIN
      SELECT @OUT_RTN=ITEM_CD1 FROM M_ITEM
      WHERE ITEM_CD1=@IN_ITEM_CD1 AND ITEM_CD2=@IN_ITEM_CD2 AND ITEM_FLG IN('1','2','3')
     END
     ELSE
     BEGIN
      SELECT @OUT_RTN=ITEM_CD2 FROM M_ITEM
      WHERE ITEM_CD1=@IN_ITEM_CD1 AND ITEM_CD2=@IN_ITEM_CD2 AND ITEM_FLG IN('1','2','3')
     END
    END  
   RETURN @OUT_RTN
END

GO

 

 


http://www.niftyadmin.cn/n/3459241.html

相关文章

官网下载jdk的步骤

打开网址&#xff1a; https://www.oracle.com鼠标悬浮在 ‘Menu’ 》 悬浮在 ‘Developers’ 》点击 ‘Developers Porta 3. 下拉 》点击 ‘Java’ 4. 下拉 》点击 ‘Download’ 5. 点击 ‘Download 6. 下拉到最后找到 ‘Java Archive’ 》 点击 ‘DOWNLOAD’ 7. …

C/C++Unix网络编程-IPC简介

IPC是进程间通信的简称。 进程、线程与信息共享 Unix进程间的信息共享的方式&#xff1a; (1) 左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息、每个进程都得穿越内核(例如read、write、lseek等)。当一个文件有待更新时&#xff0c;某种形式的同步…

【跃迁之路】【613天】程序员高效学习方法论探索系列(实验阶段370-2018.10.17)...

(跃迁之路)专栏 实验说明 从2017.10.6起&#xff0c;开启这个系列&#xff0c;目标只有一个&#xff1a;探索新的学习方法&#xff0c;实现跃迁式成长实验期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我将以自己为实验对象。我将开源我的学习方法&#xff0c;方法不断…

SQL SERVER触发器实现

基于SQL SERVER触发器技术的实现 出处&#xff1a;http://www.jstvu.edu.cn/xuebao/2002-3/pages/jiaoyujishu/sqlserver.htm 收稿日期&#xff1a;2002-02-25作者简介&#xff1a;沈晨鸣(1963-)&#xff0c;男&#xff0c;江苏南京人&#xff0c;南京工程学院计算机工程系讲…

C++浅谈内存模型

一个程序的生命 程序是一群指令的集合。 手写的cpp代码是存储在磁盘上的&#xff08;固态硬盘等&#xff09;&#xff0c;这时候没有什么内存的概念&#xff0c;只是把写进入的内容存储下来&#xff0c;等点击编译器的编译按钮的时候&#xff0c;编译器的运行程序&#xff08;…

vue之父子组件间通信实例讲解(props、$ref、$emit)

组件间如何通信&#xff0c;也就成为了vue中重点知识了。这篇文章将会通过props、$ref和 $emit 这几个知识点&#xff0c;来讲解如何实现父子组件间通信。 组件是 vue.js 最强大的功能之一&#xff0c;而组件实例的作用域是相互独立的&#xff0c;这就意味着不同组件之间的数据…

洛谷P3230 比赛

emmmmmm&#xff0c;这个之前讲课的原题居然出到比赛里了。 我怒肝2h然后A了此题&#xff0c;结果还是被某高一巨佬吊打...... 题意&#xff1a;n个球队两两比赛&#xff0c;胜得3分&#xff0c;败得0分&#xff0c;平得1分。 现有一个总分表&#xff0c;求问可能的比赛情况。 …

SQL SERVER触发器 使用 游标范例

create trigger tr_insert on 表 for inset as declare tb cursor for select * from inserted open tb fetch next from into ... while fetch_status0 being 处理语句 fetch next from into ... end close tb deall…