SQLServer – 约束

图片 33

封锁定义

对于数据库来讲,基本表的完整性节制分为列级约束原则和表级约束标准:

列级约束标准

     
 列级节制规范是对某一个特定列的羁绊,包括在列定义中,能够平素跟在该列的别样概念之后,用空格分隔,不用钦赐列名。

表级节制原则

     
 表级节制标准与列定义互相独立,不包括在列定义中,平日用于对七个或八个以上的列一齐开展封锁。

风流罗曼蒂克、约束的分类

  在SQLServer中,有3种分裂档期的顺序的束缚。

  1、实体约束

    实体约束是关于行的,举个例子某生机勃勃行现身的值就不容许出以后其余行,举例主键。

  2、域约束

    域约束是有关列的,对于具有行,某一列有那么些节制,举个例子CHECK节制。

  3、参照完整性限制

    借使某列的值必得与其余列的值非凡,那就意味着必要叁个参照完整性限定,例如外键。

CHECK限定增多准绳

1、CHECK
限制用于限定列中的值的范围。

2、Check约束通过逻辑表明式来判别数据的有效,用来节制输入一列或多列的值的界定,在列中匡正数据时,所要输入的开始和结果必得满足Check约束的条件,不然将不恐怕精确输入。

3、假设对单个列定义 CHECK
限制,那么该列只允许特定的值。

4、借使对八个表定义 CHECK
节制,那么此约束会在特定的列中对值举办限定。

DEFAULT节制加多法则

1、若在表中定义了暗中认可值约束,客商在插入新的数据行时,如若该行未有一些名数量,那么系统将暗中同意值赋给该列,如若我们不设置暗中同意值,系统默以为NULL。

2、假设“私下认可值”字段中的项替换绑定的暗中认可值(以不带圆括号的样式展现),则将唤起您杀绝对私下认可值的绑定,并将其替换为新的默许值。

3、若要输入文本字符串,请用单引号 (‘)将值括起来;不要采取双引号
(“卡塔尔,因为双引号已封存用于带引号的标志符。

4、若要输入数值暗中同意值,请输入数值并且毫不用引号将值括起来。

5、若要输入对象/函数,请输入对象/函数的名目何况永不用引号将名称括起来。

运用SSMS数据库管理工科具改过CHECK节制

1、展开数据库,接受数据表-》右键点击-》选用设计(大概扩充限制,选用限定,右键点击,选拔改正,前边步骤相像卡塔尔国。

图片 1

图片 2

2、选取要改进的数目列-》右键点击-》选取CHECK限制。

图片 3

3、在CHECK约束弹出框中-》采取要矫正的限定-》输入约束表明式-》输入限定名和平合同束描述-》选择表设计器法规-》点击关闭。

图片 4

 4、点击保存开关(大概ctrl+s卡塔尔(قطر‎-》刷新表查看改正结果。

图片 5

封锁介绍

在数据库管理体系中,保障数据库中的数据完整性是特别首要的。所谓数据完整性,正是指存款和储蓄在数据库中数量的生机勃勃致性和不利。限拟订义关于列中允许值的平整,是挟持完整性的正式机制。使用约束优先于接受触发器、准则和默许值。查询优化器也使用限拟定义生成高质量的询问实践安顿。

数据完整性分类

在SQL
Server中,依照数量完整新格局所效劳的数据库对象和限量不生机勃勃,可以将数据完整性分为以下三种:

实体完整性

实体完整性简单的讲,就是将表中的每风流倜傥行看作八个实体。实体完整性要求表的标记符列或主键的完整性。能够因而确立独一索引、P奥迪Q7IMAEvoqueY
KEY约束、UNIQUE约束,以致列的IDENTITY属性来实行实体完整性。

域完整性

域完整性是指给定列的输入有效性。需求表中钦定列的数码颇负无可争论的数据类型、格式和有效的多少范围。强制域有效性的情势有:节制类型(通过数据类型)、格式(通过
CHECK 节制和法则)或大概值的范围。域完整性通过 FOREIGN KEY 约束、CHECK
约束、DEFAULT 定义、NOT NULL 定义和法则来达成。

引用完整性

援引完整性又称参照完整性。援引完整性维持被参照表和参照表之间的多少生龙活虎致性,它经过主键(P福睿斯IMA讴歌MDXY
KEY)节制和外键(FOREIGN
KEY)约束来落实。援用完整性确认保障键值在装有表中意气风发致。那样的豆蔻梢头致性需要无法引用不设有的值,倘使键值修正了,那么在全体数据库中,对该键值的保有引用要开展相似的转移。在被参照表中,当其主键值被其余表所参照时,该行不可能被删去也不准改造。在参谋表中,不容许参照官样文章的主键值。

二、节制命名

  在攻读限定早前,首先来领悟下为束缚命名须求介意哪些地方。

  SQLServer在我们不提供名称时,会自行成立名称,不过由系统自动创建的名称并不是特地有用。

  举例,系统生成的主键名称或许是如此的:PK_Employees_145C0A3F。 

  PK代表主键(primary
key卡塔尔(قطر‎,Employees代表在Employees表中,而剩余的“145C0A3F”部分是为着保证唯黄金年代性而随意生成的值。只有因此脚本创造才会获得这种值,假若是透过Managerment
Studio创制表,那么就径直是PK_Employees。

  对于系统自动生成的Check约束名称如:CK_Customers_22AA2996。CK代表这是三个Check约束,Customers代表是在Customers表中,前边的22AA2996仍然二个随机数。假若三个表中有多少个Check约束,则命名大概如下:

  CK_Customers_22AA2996

  CK_Customers_25869641

  CK_Customers_267ABA7A

  假设您要求纠正这么些限制当中的叁个,那么你很难辨识这几个约束到底是哪一个。

  由此,为了可以一眼看上去就知晓那一个限制是用来干什么的,我们应当利用朝气蓬勃种简单明了的短语来开展命名。

  举例要保障某一列电话号码格式精确的封锁,大家能够动用命名CK_Customers_PhoneNo那样的短语来定名。

  一句话来讲命名要到位以下几点:

  1、一致性

  2、老妪能解

  3、满意上述多少个规范化的状态下简化名称。

利用SSMS数据库管理工科具加多CHECK节制

1、连接数据库,选用数据库,选取数据表-》右键点击(也许直接点击限制,右键点击,采用丰裕约束,前面步骤同样卡塔尔国-》选择设计。

图片 6

2、选拔要增加节制的多少列-》右键点击-》选拔CHECK限定。

图片 7

3、在CHECK约束弹出框中式茶食击增添。

图片 8

4、在CHECK约束弹出框中-》输入CHECK约束表达式-》输入CHECK限定名-》输入CHECK约束描述-》别的能够选取暗许。

图片 9

5、点击关闭-》点击保存开关(大概ctrl+s卡塔尔(英语:State of Qatar)-》刷新表查看结果。

图片 10

运用SSMS数据库管理工科具增添DEFAULT节制

1、连接数据库,接受数据表-》右键点击-》选取设计。

图片 11

2、在表设计窗口中-》采用数据列-》在列属性窗口中找到暗许值或绑定-》输入暗中认可值(注意暗中同意值的数据类型和输入格式卡塔尔。

图片 12

3、点击保存开关(可能ctrl+s卡塔尔(قطر‎-》刷新表-》再度展开表查看结果。

图片 13

选择T-SQL脚本更改CHECK节制

CHECK限定改革法则必须首先删除现存的CHECK自律,然后使用新定义再次创建,技巧使用Transact-SQL改过CHECK约束。

语法:

–修改check约束
use 数据库名
go

–假设封锁存在则先删除
if exists(select * from sysobjects where
name=约束名)
alter table 表名 drop constraint
约束名;
go

–加多封锁
alter table 表名
–with check
–该约束是或不是采用于现成数量,with check表示应用于现存数量,with
nocheck代表不选用于现成数据
add constraint 约束名
check
not for replication
–当复制代理在表中插入或更新数据时,禁用该约束。
(限定表达式卡塔尔;
go

–向表中加多新数据或更新表中现存数据时是不是禁止使用该限定。check表示校验,nocheck表示不校验
–alter table 表名
–check
–constraint 表名;
–go

–增添check约束描述
execute sp_addextendedproperty
N’MS_Description’, N’约束描述’, N’SCHEMA’, N’dbo’, N’TABLE’, N’表名’,
N’CONSTRAINT’, N’限制名’;
go

示例:

–修改check约束
use testss
go

–假若封锁存在则先删除
if exists(select * from sysobjects where
name=’u_check2′)
alter table test1 drop constraint
u_check2;
go

–增添封锁
alter table test1
–with check
–该限制是还是不是选拔于现成数量,with check代表应用于现成数据,with
nocheck代表不使用于现成数量
add constraint u_check2
check
not for replication
–当复制代理在表中插入或更新数据时,禁止使用该约束。
(height>=100 and height
<=200);
go

–向表中增添新数据或更新表中幸存数量时是否禁止使用该节制。check代表校验,nocheck代表不校验
–alter table test1
–check
–constraint u_check2;
–go

–增加check限定描述
execute sp_addextendedproperty
N’MS_Description’, N’改正节制’, N’SCHEMA’, N’dbo’, N’TABLE’, N’test1′,
N’CONSTRAINT’, N’u_check2′;
go

图片 14

图片 15

自律分类

SQLServer中有四种限制类型,分别是 P君越IMAXC60Y
KEY约束、FOREIGN
KEY节制、UNIQUE约束、DEFAULT约束、和CHECK节制。查看恐怕创建约束都要选用到
Microsoft SQL Server Managment Studio。

三、键约束

利用T-SQL脚本增多CHECK节制

运用T-SQL脚本加多DEFAULT节制

CHECK约束改善优劣点

优点:

1、改善数据库CHECK约束能够保障数据的标准性和完整性。

缺点:

1:矫正约束的表设计器使用准绳时,或者会挑起原有数据与约束的冲突。

 

PRIMARY KEY约束

在表中常常有一列或多列的组合,其值能唯生机勃勃标志表中的每黄金年代行,那样的一列或多列成为表的主键(PrimaryKey卡塔尔(英语:State of Qatar)。

一个表只可以有三个主键,何况主键约束中的列不能够为空值。

除非主键列本事被看作其余表的外键所开创。

1、主键限制

   主键是每行的唯风华正茂标记符,仅仅经过它就能够靠谱定位到风流倜傥行,个中主键列在整体表中无法有再次,必需带有唯后生可畏的值(不可能为NULL卡塔尔。由于主键在关周全据库中的主要性,因此它是全部键和自律中最器重的。

   上边包车型大巴话说主键的始建方式

  1、在成立表的时候创制主键约束。

create table customer
(
    customerId        int identity    not null
        primary key,  --创建主键约束
    CustomerName    nvarchar(30)    not null
);

  怎样,特别轻便吧!

  2、在已存在的表上成立主键节制

  现在只要已经存在了一张表,可是还尚无主键限定:

alter table person
    add constraint PK_Employee_Id  --外键名称
    primary key(personId)  --personId 字段名

  alter名称告诉SQLServer如下消息:

  1、增多了少年老成部分剧情到表中(也能够去除表中的少数内容卡塔尔国

  2、加多了什么样内容(叁个限制卡塔尔(英语:State of Qatar)

  3、对限定的命名(允许今后直接待上访谈限定卡塔尔国

  4、节制的花色(主键约束卡塔尔

  5、约束应用于哪个列。

  3、复合主键的创立

  假诺实在Management
Studio中,创建复合主键,只要求按住Ctrl键,选中多个列,然后设置为主键就OK了,极其轻巧。上边主要描述使用T-SQL成立复合主键的点子:

ALTER TABLE 表名 WITH NOCHECK ADD 
CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED 
( 
[字段名1], 
[字段名2] 
) 

  在多对多沟通中,平时会有一张表来描述别的两张表的涉嫌,就以此读者和书为例子:

图片 16

ALTER TABLE ReaderAndBook 
ADD 
CONSTRAINT [PK_ReaderAndBook] PRIMARY KEY NONCLUSTERED 
( 
ReaderId, 
BookId 
) 

图片 17

当表布局存在时

增加CHECK节制时首先校验约束是不是已存在,假使存在应该是先删除再加多,假如不设有则一贯抬高。

语法:

— 增加一个暗许节制
use 数据库名;
go

if exists(select * from sysobjects where
name=约束名)
alter table 表名 drop constraint
约束名;
go

alter table 表名 add constraint 约束名
check(约束准绳卡塔尔国,constraint 限制名 check(约束法规卡塔尔;
go

示例:

— 增添多少个暗中同意约束
use testss;
go

if exists(select * from sysobjects where
name=’check1′)
alter table test1 drop constraint
check1;
go

alter table test1 add constraint check1
check(height>=170 and height<=175);
go

 图片 18

图片 19

当表结构已存在时

第黄金年代判别表中是还是不是存在默许限制,若是存在则先删除暗中认可限定再增加,纵然空头支票则直接助长。

语法:

use 数据库
go
–剖断暗中认可节制是不是存在,假如存在则先删除,借使不设有则向来抬高
if exists(select * from sysobjects where
name=约束名)
alter table 表名 drop constraint
约束名;
go
–给钦点列加多暗许约束
alter table 表名 add constraint 约束名
default(约束值) for 列名;
go

示例:

use [testss]
go
–判别暗中认可节制是不是留存,如果存在则先删除,借使不设有则直接助长
if exists(select * from sysobjects where
name=’defalut_height’)
alter table [testss].[dbo].[test1]
drop constraint defalut_height;
go
–给内定列添加暗中认可约束
alter table [testss].[dbo].[test1]
add constraint defalut_height default(160) for height;
go

图片 20

图片 21

FOREIGN KEY约束 

外键限定是用来增长五个表(主表和从表)的一列或多列数据里面包车型大巴连续几天的。

始建国门外键约束的各类是先定义主表的主键,再对从表定义外键限制。

除非主表的主键技能被从表用来作为外键使用,被封锁的从表中的列能够不是主键,主表约束了从表更新和插入的操作。

2、外键限定

  外键不只能确认保障数据完整性,也能表现表之间的涉嫌。加多了外键之后,插入援用表的记录要么必需被引用表中被引述列的某条记下相称,要么外键列的值必得安装为NULL。

  外键和主键不相符,每种表中的外键数目不限量唯风华正茂性。在各种表中,每大器晚成有-~253个外键。唯大器晚成的范围是二个列只好援引一个外键。一个列能够被多个外键引用。

  1、创制表的时候成立外键

图片 22

create table orders
(
    orderId        int identity    not null
        primary key,
    customerId    int                not null
        foreign key references customer(customerId)  --约束类型-外键-引用表(列名)
);

图片 23

  2、在已存在的表中增添几个外键

  假如上边包车型客车代码去掉了丰硕外键行,那么能够书写代码如下:

alter table orders
    add constraint FK_Orders_CustomerId        --添加约束 名称
        foreign key (customerId)    references customer(customerId)    --外键约束,外键列名,被引用列名

  刚加多的自律和在此之前拉长的约束同样生效,假如某行引用customerId不设有,那么就不容许把该行增多到Orders表中。

  3、级联合浮动作

  外键和任何类型键的多个重视差异是:外键是双向的,即不仅仅是限量子表的值必得存在于父表中,还在每便对父表操作后检查子行(这样幸免了孤行卡塔尔国。SQLServer的私下认可行为是在子行存在时“节制”父行被去除。但是,一时会自行删除任何依附的笔录,实际不是防御删除被引用的记录。相符在改过记录时,恐怕希望依靠的记录自动引用刚刚更新的记录。少之又少见的境况是,你大概希望将征引行改动为有些已知的意况。为此,能够选拔将依靠行的值设置为NULL恐怕十分列的暗许值。

  这种进行活动删除和自动更新的进程称为级联。这种进度,特别是删除进程,能够通过几层的来说关系(一条记下信赖于另一条记下,而那另一条记下又依靠其余记录卡塔尔。在SQLServer中得以达成级联合浮动作要求做的正是修改外键语法-只供给在加上前边加上ON子句。比方:

alter table orders
    add constraint FK_Orders_CustomerId        --添加约束 名称
        foreign key (customerId)    references customer(customerId)    --外键约束,外键列名,被引用列名
        on update     no action    --默认  修改时不级联更新子表
        on delete     cascade      --删除时级联删除依赖行

  当在开展级联删除时,要是三个表级联了另二个表,而另多个表又级联了别样表,这种级联会平素下去,不受约束,那实乃级联的三个摇摇欲倒之处,比较轻易五个十分大心删掉大批量数量。

  级联合浮动作除了no action,cascade之外,还应该有set null和set
default。后八个是在SQLServer二〇〇六中引进的,假设要合作到SQLServer2004的话,要避免使用那四个级联合浮动作。但是她们的才做是极其轻易的:假若实践更新而更改了一个父行的值,那么子行的值将被设置为NULL,或许安装为该列的暗许值(不管SET
NULL照旧SET DEFAULT卡塔尔。

  4、外键别的地点的思虑

    外键中的之唯有入选恐怕的选料:

    1、在列中填充与被引述表中的附和列相相配的值。

      通过定义援引列为NOT
NULL,能够使外键完全都以必须的(即客户增进数据时必得引用表中必需有相相称的一整套数据卡塔尔国。

    2、不填充当何值,而使该值为NULL。

      允许援用列有NULL值时,客户能够筛选不提供值-尽管在被援用表未有与NULL值匹配的行,依旧同意插入。

当表构造空头支票时

生龙活虎经表布局不设有,能够平素抬高度大约束,能够况兼添加二个要么多少个约束。

语法:

–如若表布局一纸空文时加多check节制
use 数据库名;
go
–假如已存在表则删除
if exists(select * from sysobjects where
name=表名 and xtype=’U’)
drop table 表名;
go
–创建表
create table 表名
(
–字段注脚
列名 int identity(1,1) not null,
列名 nvarchar(50) null,
列名 nvarchar(50卡塔尔(قطر‎ null constraint 限制名
check(限制法则卡塔尔(英语:State of Qatar),
列名 nvarchar(50) null,
列名 int,
列名 int constraint 约束名
check(约束准则卡塔尔(قطر‎
primary key clustered(列名 asc)
with(ignore_dup_key=off) on [primary], –主键索引注解
)on [primary]

–字段注释注明
exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列描述’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列描述’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列描述’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列描述’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列描述’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

go

示例:

–倘若表布局不设不时加多check节制
use testss;
go
–假设已存在表则删除
if exists(select * from sysobjects where
name=’test1′ and xtype=’U’)
drop table test1;
go
–创建表
create table test1
(
–字段评释
id int identity(1,1) not null,
name nvarchar(50) null,
sex nvarchar(50) null constraint check1
check(sex=’男’ or sex=’女’),
age nvarchar(50) null,
classid int,
height int constraint check2
check(height>=110 and height<=120)
primary key clustered(id asc)
with(ignore_dup_key=off) on [primary], –主键索引注脚
)on [primary]

–字段注释注解
exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’id主键’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’id’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’姓名’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’name’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’性别’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’sex’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’年龄’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’age’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’班级id’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’classid’;

go

 图片 24

图片 25

图片 26

开创表时拉长私下认可节制

先是判断表是不是选在,假使存在则先删除表再增添,若是不设有则平素抬高。

语法:

–创立新表时加多暗中认可节制
–数据库注明
use 数据库名
go
–假如表已存在则先删除表再次创下造,如若表不设有则一向开立
if exists(select * from sysobjects where
name=表名 and type =’U’)
drop table 表名;
go
–建表语法申明
create table 表名
(
–字段注明
列名 列类型 identity(1,1) not
null,
列名 列类型) null,
列名 列类型 null,
列名 列类型 null,
列名 列类型,
列名 列类型 constraint 约束名 default
默认值,
primary key clustered(列名 asc)
with(ignore_dup_key=off) on [primary] –主键索引注明
)on [primary]

–字段注释注解
exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列说明’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列说明’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列说明’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列说明’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’列说明’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’表名’,
@level2type=N’COLUMN’,@level2name=N’列名’;

go

示例:

–创造新表时加多私下认可节制
–数据库证明
use testss
go
–假如表已存在则先删除表更创造,假设表不设有则一直成立
if exists(select * from sysobjects where
name=’test1′ and type =’U’)
drop table test1;
go
–建表语法表明
create table test1
(
–字段评释
id int identity(1,1) not null,
name nvarchar(50) null,
sex nvarchar(50) null,
age nvarchar(50) null,
classid int,
height int constraint default_he default
166,
primary key clustered(id asc)
with(ignore_dup_key=off) on [primary] –主键索引证明
)on [primary]

–字段注释证明
exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’id主键’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’id’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’姓名’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’name’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’性别’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’sex’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’年龄’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’age’;

exec sys.sp_addextendedproperty
@name=N’MS_Description’, @value=N’班级id’ ,
@level0type=N’SCHEMA’,
@level0name=N’dbo’,
@level1type=N’TABLE’,@level1name=N’test1′,
@level2type=N’COLUMN’,@level2name=N’classid’;

go

图片 27

图片 28

UNIQUE约束

唯风流洒脱节制有限援救表中的一列数据未有相近的值。

与主键节制相近,唯大器晚成约束也强制唯蓬蓬勃勃性,但唯豆蔻年华限制用于非主键的一列也许多列的结合,且一个表能够定义四个唯意气风发节制。

3、唯风华正茂节制

  唯生龙活虎节制与主键比较日常,同盟点在于它们都必要表中钦定的列(或然列的构成卡塔尔(英语:State of Qatar)上有一个唯风流倜傥值,区别是并世无两限定未有被看作表中记录的唯大器晚成标志符(即便你能够按那样的办法使用也使得卡塔尔(قطر‎,并且能够有三个唯大器晚成约束(而在种种表中只好有贰个主键卡塔尔国。

  大器晚成旦成立了唯黄金时代节制,那么钦点列中的每一个值必得是天下无双的。假诺更新或然插入一条记下在带唯豆蔻梢头节制的列上有曾经存在的值的笔录,SQLServer将抛出荒诞,推却这一个记录。

  和主键差异,唯豆蔻年华节制不会自行幸免设置多个NULL值,是还是不是同意为NULL由表中相应列的NULL选项的装置决定,但就算真的允许NULL值,一张表中也只好够插入一个NULL值(倘若允许多个,这就不叫独一了卡塔尔(英语:State of Qatar)。

  在已存在的表上创造唯后生可畏节制:

alter table Account
    add constraint AK_AccountName    --约束名
    unique (Account_Name)    -- 列名

  AK代表替换键(Alternate Key卡塔尔(英语:State of Qatar),唯黄金时代约束也叫替换键。

  主键和唯风流倜傥限定的分歧:

  •    
    主键节制不准出现NULL值。任何索引的索引键都不容许满含null值。但唯黄金年代限定允许满含NULL值,但唯后生可畏限定把多少个NULL值充作重复值,所以施加了唯意气风发节制的每一列只同意包蕴一个NULL值。
  •    
    创制主键时会自动制造聚焦索引,除非当前表中曾经满含了聚集索引或是创造主键时钦赐了NONCLUSTERED关键字。
  •    
    创建唯风姿罗曼蒂克节制时会自动创制非集中索引,除非你钦命了CLUSTERED关键字何况当前表中还没曾聚集索引。
  •     各类表中只好有二个主键,但能够由多个唯生机勃勃节制。

CHECK限定优劣点

优点:

1、保证列数据标准和范围,能够约束数据完整性

2、有Check限制的列能够提供给查询优化器音讯之所以进步质量

缺点:

1、插入大概涂改时数据不切合限制准则,不能修正成功。

DEFAULT约束优瑕疵

优点:

1、使用暗中认可值能够缩小代码量,新增增加少时能够不用写新扩展暗许值列,试行新扩张操作时时暗中同意填充。

2、较实惠开展计算和分析,以致便于程序逻辑操作。

缺点:

1、使用不为NULL的暗中认可值,占用了更加多的存款和储蓄空间。

 

DEFAULT约束

若在表中定义了默许值节制,客商在插入新的数额行时,即使该行未有一些名数量,那么系统将默认值赋给该列,就算大家不安装私下认可值,系统默感觉NULL。

4、CHECK约束  

  CHECK约束约束能够和二个列关联,也可以和叁个表关联,因为它们得以检查叁个列的值绝对于此外三个列的值,只要那个列都在同一个表中以至值是在立异也许插入的相仿行中。CHECK约束还足以用来检查列值组合是不是满意某贰个正式。

  能够像使用where子句同样的准绳来定义CHECK节制。CHECK节制原则的演示如下:

目标 SQL
限制Month列为合适的数字 BETWEEN 1 AND 12
正确的SSN格式 LIKE'[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]’
限制为一个快递公司的特定列表 IN(‘UPS’,’Fed Ex’,EMS’)
价格必须为正数 UnitPrice >= 0
引用同一行中的另外一列 ShipDate >= OrderDate

  上边给出的列表只是一小部分,而标准实际上市Infiniti多的。差十分少具备能够停放where子句的规格都得以停放该节制中。并且和任何选拔(法规和触发器卡塔尔相比较,CHECK约束实践进程越来越快。

  在已存在的表中增加三个CHECK约束:

alter table Account
    add constraint CN_AccountAge
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

  固然那时视图增多一条不满足的笔录,将报如下错误:

  insert into Account values (22,'洪',17)

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"CN_AccountAge"冲突。该冲突发生于数据库"Nx",表"dbo.Account", column 'Account_Age'。
语句已终止。

CHECK约束

CHECK 限定用于节制列中的值的限量。

Check约束通过逻辑表明式来剖断数据的灵光,用来界定输入一列或多列的值的限制,在列中创新数据时,所要输入的内容必得满足Check限制的条件,不然将无法精确输入。

假如对单个列定义 CHECK
节制,那么该列只同意特定的值。

假若对八个表定义 CHECK
节制,那么此约束会在一定的列中对值举行限制。

5、DEFAULT约束

  和装有限制相似,DEFAULT约束也是表定义的二个组成都部队分,它定义了当插入的新行对于定义了私下认可限制的列未提供相应数额时该如何是好。能够定义它为一个字面值(譬喻,设置暗许薪俸为0,恐怕安装字符串列为”UNKNOWN”卡塔尔(英语:State of Qatar),只怕某些系统值(getdate(卡塔尔国卡塔尔(قطر‎。

  对于DEFAULT约束,要打听以下几脾天性:

  1、暗许值只在insert语句中央银行使-在update语句和delete语句中被忽视。

  2、固然在insert语句中提供了自便值,那就不采纳暗中同意值。

  3、若无提供值,那么总是利用暗许值。

  值得注意的是,update命令的法规由三个非常的小器晚成,借使显示表达使用默许值正是莫衷一是。能够经过应用首要字DEFAULT表示更新的值设置为暗中认可值。

  5.1在创立表时概念DEFAULT节制:

图片 29

create table person
(
    person_id int identity not null
        primary key,
    person_name nvarchar(30) not null
        default '无名氏',
    person_age int not null
)

图片 30

  在实行语句后:

insert into person (person_age) values(24)

  表中被插入一条记下如下:

  图片 31

   5.2在已存在的表上加多DEFAULT限制:

alter table person
    add constraint CN_DefaultName
    default    '无名氏' for person_name

封锁优瑕疵

优点:

1、保持数据库完整性。

2、保障列中数量的唯少年老成性。

3、插入、更新、删除时严苛的界定校验机制。

4、快速。

5、能够引用别的列。

6、在命令推行前发出。

7、遵循ANSI标准。

缺点:

1、插入、更新、删除时索要校验准绳比较麻烦。

2、必需对各样表重新定义。

3、不能够引用其他表。

4、不能够绑定到数据类型。

 

6、禁止使用约束

   有的时候大家想有的时候或永远地消亡限定。不过SQL
Server并不曾提供删除约束的方式。SQL
Server只允许禁止使用外键限制或CHECK约束,而同时保险约束的完整性。

   禁止使用三个数据完整性准绳经常是因为已经有不行数据了。那样的数额日常分为以下两类:

  1、在开创约束时早就在数据库中的数据

  2、在封锁成立现在希望丰硕的多少

  SQL
Server允许禁用完整性检查生龙活虎段时间来对两样的不行数据作管理,然后再另行启用完整性(不是大体删除数据完整性节制)。

    介意:不能够禁止使用主键约束照旧唯生龙活虎限定

  6.1、在开创约束时,忽视检查在此以前的不满意数据

  要增多三个束缚,不过有不利用到已存在的数据中,能够再实施Alter
Table语句加多约束时采取WITH NOCHECK选项。

  根据上面成立Check限定的点子,已经Alter
Table时,表中自个儿已经存在不合乎的数量,那么Alter Table操作将被SQL
Server谢绝实行。除非已经存在的兼具数据都满足CHECK节制的规格,不然SQL
Server不会实践成立约束的通令。要消除那一个难题,大家可以增加WITH NOCHECK。

  大家先新建一个表独有3个字段的表,Id、姓名、年龄,并在里头插入一条不满足须要的多少:

insert into Account values (23,'洪',17)

   然后施行加多封锁命令:

alter table Account
    add constraint CN_AccountAge18
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

   SQL Server报一下荒诞:

消息 547,级别 16,状态 0,第 1 行
ALTER TABLE 语句与 CHECK 约束"CN_AccountAge18"冲突。该冲突发生于数据库"Nx",表"dbo.Account", column 'Account_Age'。

   此时大家换一种办法去施行:

alter table Account
    WITH NOCHECK
    add constraint CN_AccountAge18
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

   以上代码就能够成功实施,况兼只有现在加多的数码具备约束,从前增进的不相符条件的数额记录照旧留存。

   6.2如今禁止使用已存在的羁绊

   当我们必要从另生机勃勃数据库中程导弹入数据到表中,而表中已创建了束缚的时候,或者会设有部分多少和法则差异盟。当然有一个缓慢解决格局是先删除限制,增加须求的数额,然后WITH
NOCHECK在增进回来。可是那样做太费力了。大家无需这么做。大家能够利用名称为NOCHECK的选项来运维ALTEEvoque语句,那样就可以预知打消要求的牢笼。

  先来看看上节中开创的那一个限制:

alter table Account
    add constraint CN_AccountAge18
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

   要撤回上述限制能够如此来:

Alter Table Account
    NOCHECK
    constraint CN_AccountAge18

  实行命令:

  insert into Account values (25,'取消了约束',17)

  实施成功,成功增多了一站式数据。

  介怀到又可以向表中插入格式不宽容的数目了。

  这里要验证下,如下知道贰个羁绊是不是是启用依然禁止使用呢?sp_helpconstraint命令,当大家实施sp_helpconstraint的时候,会有一列status_enabled展现该限定的启用景况:

  sp_helpconstraint Account

  图片 32

   留意到status_enabled名列Disabled表达是禁止使用的意趣。

  当要启用约束时,只需求用将语句中的NO CHECK替换为CHECK就足以了:

Alter Table Account
    CHECK
    constraint CN_AccountAge18

   实行之后,约束又启用了:再来sp_helpconstraint看下:

  图片 33

   留意到status_enabled列形成了Enabled。

  status_enabled的二种景况如下:

  Enabled:启用;

  Disabled:禁用;

7、准绳和暗许值

  法则和私下认可值的采取要早于CHECK和DEFAULT约束。他们是较老的SQL
Server备用约束的一片段,当然亦非尚未亮点。自7.0本子之后,MicroSoft列出法规和暗中同意值只是为着向后十一分,而不计划在之后继续扶助那几个特点。因而对于生成新代码时,应该利用节制。

  准则、暗许值与限制的本质差异是:约束是三个表的风味,本人未有存在情势,而平整和默许值是表和本身的莫过于指标,本人存在。约束是在表定义中定义的,而平整和默许值是单身定义,然后”绑定到”表上。

  准则和暗中同意值的独门对象天性使得它们得以在任用时毫不再行定义。实际上,法规和暗中同意值不幸免被绑定到表上,它们也能够绑定到数据类型上。

  7.1规则

   准绳和CHECK节制非常相似。它们之间的独步一时差距是法规每一回只可以功用于贰个列。能够将长期以来准绳分别绑定到三个表中的多个列,不过法则分别效率于各类列,根本不会发现到其余列的留存。像QtyShipped

<=
QtyOrdered那样的节制不适用于准则(它引用几个列卡塔尔,而LIKE([0-9][0-9][0-9]卡塔尔国那样的概念适用于法则。

  概念准绳:

  上边定义一个不成方圆,那样就能够率先看见有别于所在:

CREATE RULE Age18Rule
    AS @Age > 18  

  这里相比的是二个变量,不管被检查的列是什么值,这么些值将用于替换@Age。因而在此个示例中,法规所绑定的此外列的值都必得高于18。

  到方今结束,只是创造了二个法规,但那一个准则还未对任何表的此外列起效果,要激活那几个准绳须求接收叁个仓储进度:sp_bindrule。

  将准绳Age18绑定到表person的person_age列:

  EXEC sp_bindrule 'Age18Rule','person.person_age';

  这时候,假使大家实践不满意准绳的插入操作:

insert into person values ('绑定规则',17)

   将回到如下报错音讯:

消息 513,级别 16,状态 0,第 1 行
列的插入或更新与先前的 CREATE RULE 语句所指定的规则发生冲突。该语句已终止。冲突发生于数据库 'Nx',表 'dbo.person',列 'person_age'。
语句已终止。

  很明显,法则已经生效。

  要特别注意的是,在绑定早先,准绳与其他表,任何列都不曾关系,因而在绑定的时候,第三个参数要加.钦点表名与列名(tablename.column卡塔尔(قطر‎。

  清除绑定准则:

  当我们须求在贰个列上清除绑定法规的时候,只要进行sp_unbindrule

  删除刚才绑定的规规矩矩:

EXEC sp_unbindrule 'person.person_age';

  那个时候,试行方才的插入操作,就不会报错了。

  去除准绳:

  假若希望将法则从数据库中到底去除,那么可以在表中动用特别熟知的DROP语法。

DROP RULE <rule name>

  如删减刚才创造的那条法则:

DROP RULE Age18Rule

  7.2默认值

  私下认可值肖似于DEFAULT。实际上默许值-DEFAULT约束的关系与准则-CHECK节制的关系多数。差距在于它们被追加到表中的点子和对客商自定义数据类型的暗中同意值(是指标,并不是束缚)支持。

  定义默许值的语法和定义法则相似:

  CREATE DEFAULT <default_name>
  AS <default value>

  创办默许值:

  因而,就算要为Age定义三个值为0的暗中认可值:

CREATE DEFAULT AgeDefault
AS 0

  绑定暗中同意值:

  雷同,假若不绑定到四个指标上,则暗许值是不起作用的。要绑定的话,使用存款和储蓄进程sp_bindefault。

  EXEC sp_bindefault 'AgeDefault','person.person_age';

  要从表中消除暗许值的绑定,使用sp_unbindefault:

  sp_unbindefault 'person.person_age';

  除去默许值:

  借使要从数据库中透彻剔除一个暗中认可值,则足以应用DROP语法,与删除准绳同样:

  DROP DEFAULT AgeDefault

  7.3规定哪些表和数据类型使用给定的准绳或暗中认可值

  倘若愿意删除恐怕涂改法则或暗中认可值。那么您能够先看看如何表和数据类型在利用它们。SQL
Server照旧接受系统存款和储蓄进程化解那么些标题。那些蕴藏进程是sp_depends。其语法如下所示:

  EXEC sp_depends <object name>

  sp_depends提供了依据于您所查询对象的装有目的列表。

8、触发器

  触发器也能够用于贯彻数据完整性,那些内容超级多,新建黄金年代篇文章陈述。

9、怎么着抉择

  经过以上的求学,对于数据完整性,你会发觉有很三种得以筛选,那么哪些接纳符合的封锁呢?

限制 优点 缺点
约束

快速

可以引用其他列

在命令执行前发生

遵循ANSI标准

必须对每个表重新定义

不能引用其他表

不能绑定到数据类型

规则

独立的对象

可重用

可以绑定到数据类型

命令执行前发生

稍慢

不能跨列使用

不能引用其他表

实际上只用于向后兼容

默认值

非常灵活

可以引用其他列或其他表

可以通过.NET引用SQL Server之外的其他信息

在命令执行之后发生

系统开销很大

  要是要兑现更加壮的逻辑模型以至不足为奇运用顾客自定义数据类型,则肖似选取法规和默许值。在这里种场合下准绳和默许值能够提供超级多成效,轻便管理,而不用太多的编制程序费用。

  唯有在不可能选拔约束时利用触发器。和束缚同样,他们被增大到表中,并且必得对成立的各样表重新定义。好的方面是触发器大致能够做数据完整性方面包车型大巴此外操作。实际上再未有现身外键时,他们常被充任外键的代替品。

  而在其余处境下,应将约束作为数据完整性建设方案的选项。它们实践进程快,并且轻易创立。他们的破绽是法力有限(除了外键节制,都无法引用其余表卡塔尔(قطر‎,而且对于通用节制逻辑来说,要求二次次地再一次定义。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图